Querying Multiple Files in a Directory
DataDirect XQuery supports the use of fn:collection() to query multiple XML and non-XML files in a specified directory.
XML Files
In the following example, suppose you have a number of XML files stored in the directory books. Each of the files contains information about one book, and you want to create a single XML document that contains a list of all your books.
for $book in collection("file:///c:/books?select=*.xml") return <myBook>{$book/book/title}</myBook> </books>The result would look something like this:
<books> <myBook> <title>Emma</title> </myBook> <myBook> <title>Pride and Prejudice</title> </myBook> . . . </books>The function’s declaration for this feature is:
where:
directory_urlis a URL referencing a directory. The URL must use the file:// scheme.
optionis{(select="REGEX") | recurse={yes | no} | (sort=[a,t,r]+) | (xquery-regex=(yes|no))}where:
selectcontains a regular expression (REGEX), which determines which files in the directory are selected. Ifselectis not specified, any file is assumed.
sortdetermines how the retrieved files are sorted, as follows:
asorts alphabetically (ascending).tsorts by modification time (beginning with most recent).rcombined withaandtreverses the sort order.
recursedetermines whether subdirectories are searched. The default is no. To search subdirectories, set this option to yes, for example:for $book in collection("file:///c:/books?select=*.xml;recurse=yes")
return
<myBook>{$book/book/title}</myBook>
</books>
xquery-regexdetermines what type of regular expression syntax is specified inselect.- If set to no (the default), the select pattern syntax takes the conventional form. For example, *.xml selects all files with an xml extension. More generally, the select pattern is converted to a regular expression by prepending "^", appending "$", replacing "." with "\.", and replacing "*" with ".*". Then, the select pattern is used to match the file names appearing in the directory using the XQuery regular expression rules. So, for example, you can specify *.(xml|xhtml) to match files with either of these two file extensions.
Note however, that special characters used in the URL may need to be escaped using the %HH convention, which can be achieved using the iri-to-uri() function.
- If set to
yes, the select pattern syntax as supported by XQuery is assumed. In this case, some characters may need to be escaped such as the backslash character (\) in a file name, for example:
select=.*\.xml$must beselect=.*%5C.xml$Non-XML Files
DataDirect XQuery also supports the use of fn:collection() to query non-XML files, such as XML Converters. For example:
returns a sequence in which each item is an EDI file contained in the directory C:/myfolder.
DataDirect XQuery also supports additional arguments in fn:collection() to tune navigation of the specified directory:
fn:collection("converter:name:[property_name=value: |property_name=value: | ...]?directory_url(?option(;option)*)?")where:
nameis the name of the XML Converter. See the XML converter documentation for more information.
property_name=valueare property values specific to the converter name. See the XML converter documentation for more information.
directory_urlandoptionare the same as previously described for XML files in a directory.The following are non-XML file examples:
In this example, X12 elements from all files in the directory C:\myfolder are retrieved.
In this example, X12 elements from all files the directory C:\myfolder are retrieved, including the ones in sub-folders.
In this example, X12 elements from all files with extension .x12 in directory C:\myfolder are retrieved, including the ones in sub-folders, and they are sorted in ascending order.
See also "Collection URI Resolvers".