This [[Module Library|XQuery Module]] provides simple functions to fetch the content of resources identified by URIs. Resources can be stored locally or remotely and e.g. use the {{Code|file://}} or {{Code|http://}} scheme. If more control over HTTP requests is required, the [[HTTP Client Module]] can be used. With the [[HTML Module]], retrieved HTML documents can be converted to XML.
=Conventions=
{{Mark|Updated with Version 9.0:}}
All functions and errors in this module are assigned to the <code><nowiki>http://basex.org/modules/fetch</nowiki></code> namespace, which is statically bound to the {{Code|fetch}} prefix.<br/>
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|<pre>fetch:binary|( $uri href as xs:string|) as xs:base64Binary}}<br/pre>|-valign="top"
| '''Summary'''
|Fetches the resource referred to by the given URI {{Code|href}} string and returns it as [[Lazy Module|lazy]] {{Code|xs:base64Binary}} item.|-valign="top"
| '''Errors'''
|{{Error|open|#Errors}} the URI could not be resolved, or the resource could not be retrieved.
|-valign="top"
| '''Examples'''
|
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|fetch:text|$uri as xs:string|xs:string}}<br/pre>{{Func|fetch:text|( $uri href as xs:string, $encoding as xs:string|xs :string}}<br/>{{Func|fetch:text|$uri as xs:string, $encoding as xs:string= (), $fallback as xs:boolean|? := false()) as xs:string}}<br/pre>|-valign="top"
| '''Summary'''
|Fetches the resource referred to by the given {{Code|$urihref}} string and returns it as [[Lazy Module|lazy]] {{Code|xs:string}} item:
* The UTF-8 default encoding can be overwritten with the optional {{Code|$encoding}} argument.
* By default, invalid characters will be rejected. If {{Code|$fallback}} is set to true, these characters will be replaced with the Unicode replacement character <code>FFFD</code> (�).
|-valign="top"
| '''Errors'''
|{{Error|open|#Errors}} the URI could not be resolved, or the resource could not be retrieved.<br/>{{Error|encoding|#Errors}} the specified encoding is not supported, or unknown.
|-valign="top"
| '''Examples'''
|
|}
==fetch:xmldoc==
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|fetch:xml|$uri as xs:string|document-node()}}<br/pre>{{Func|fetch:xml|doc( $uri href as xs:string, $options as map(*)?| := map { }) as document-node()}}</pre>|-valign="top"
| '''Summary'''
|Fetches the resource referred to by the given {{Code|$urihref}} string and returns it as XML document node.<br/>In contrast to <code>fn:doc</code>, each function call returns a different document node. As a consequence, document instances created by this function will not be kept in memory until the end of query evaluation.<br/>The {{Code|$options}} argument can be used to change the parsing behavior. Allowed options are all [[Options#Parsing|parsing]] and [[Options#XML Parsing|XML parsing]] options in lower case.<br/>The function differs from {{Code|fn:doc}} in various aspects:* It is ''nondeterministic'', i.e., a new document node will be created by each call of this function.* A document created by this function will be garbage-collected as soon as it is not referenced anymore.* URIs will not be resolved against existing databases. As a result, it will not trigger any locks (see [[Transaction Management#Limitations|limitations of database locking]] for more details).|-valign="top"
| '''Errors'''
|{{Error|open|#Errors}} the URI could not be resolved, or the resource could not be retrieved.
|-valign="top"
| '''Examples'''
|
* Retrieve an XML representation of the English Wikipedia main HTML page, chop all with whitespace nodesstripped:<pre classlang="brush:'xquery"'>fetch:xmldoc("http://en.wikipedia.org", map { 'chopstripws': true() })
</pre>
* Return a document located in the current base directoryweb page as XML, preserve namespaces:<pre classlang="brush:'xquery"'>fetch:xmldoc(file 'http://basex.org/', map { 'parser': 'html', 'htmlparser': map { 'nons':base-dirfalse() || "example.xml"} })
</pre>
|}
==fetch:xmlbinary-binarydoc== {{Mark|Introduced with Version 9.0:}}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|<pre>fetch:xml-binary|$data as xs:base64Binary|document-nodedoc()}}<br/>{{Func|fetch:xml-binary| $data input as xs:base64BinaryanyAtomicType, $options as map(*)?| := map { }) as document-node()}}</pre>|-valign="top"
| '''Summary'''
|Parses binary Converts the specified {{Code|$datainput}} ({{Code|xs:base64Binary}} , {{Code|xs:hexBinary}}) to XML and returns it as XML a document node.<br/>In contrast to {{Code|fn:parse-xml}}, which expects an XQuery a string, the input of this function can be arbitrarily encoded. The encoding will be derived from the XML declaration or (in case of UTF16 UTF-16 or UTF32UTF-32) from the first bytes of the input.<br/>The {{Code|$options}} argument can be used to change the parsing behavior. Allowed options are all [[Options#Parsing|parsing]] and [[Options#XML Parsing|XML parsing]] options in lower case.|-valign="top"
| '''Examples'''
|
* Retrieves file input as binary data and parses it as XML:
<pre classlang="brush:'xquery"'>fetch:xmlbinary-binarydoc(file:read-binary('doc.xml'))
</pre>
* Encodes a string as CP1252 and parses it as XML. The input and the string {{Code|touché}} will be correctly decoded because of the XML declaration:
<pre classlang="brush:'xquery"'>fetch:xmlbinary-binarydoc(convert:string-to-base64(
"<?xml version='1.0' encoding='CP1252'?><xml>touché</xml>",
"CP1252"
))
</pre>
* Encodes a string as UTF16 UTF-16 and parses it as XML. The document will be correctly decoded, as the first bytes of the data indicate that the input must be UTF16UTF-16:<pre classlang="brush:'xquery"'>fetch:xmlbinary-binarydoc(convert:string-to-base64("<xml/>", "UTF16"))
</pre>
|- valign="top"
| '''Errors'''
|{{Error|open|#Errors}} the input could not be parsed.
|}
{| width='100%'
|-valign="top"| width='120' | '''SignaturesSignature'''|{{Func|<pre>fetch:content-type|( $uri href as xs:string|) as xs:string}}<br/pre>|-valign="top"
| '''Summary'''
|Returns the content-type (also called mime-type) of the resource specified by {{Code|$urihref}}string:
* If a remote resource is addressed, the request header will be evaluated.
* If the addressed resource is locally stored, the content-type will be guessed based on the file extension.
|-valign="top"
| '''Errors'''
|{{Error|open|#Errors}} the URI could not be resolved, or the resource could not be retrieved.
|-valign="top"
| '''Examples'''
|
=Errors=
{{Mark|Updated with Version 9.0:}}
{| class="wikitable" width="100%"
! width="110"|Code
|Description
|-valign="top"
|{{Code|encoding}}
|The specified encoding is not supported, or unknown.
|-valign="top"
|{{Code|open}}
|The URI could not be resolved, or the resource could not be retrieved.
=Changelog=
;Version 10.0
* Updated: {{Function||fetch:doc}} renamed (before: {{Code|fetch:xml}}).
* Updated: {{Function||fetch:binary-doc}} renamed (before: {{Code|fetch:xml-binary}}).
;Version 9.0
* Added: [[#fetch:xml-binary{{Code|fetch:xml-binary]]}}
* Updated: error codes updated; errors now use the module namespace
;Version 8.5
* Updated: [[#fetch:text{{Function||fetch:text]]}}: <code>$fallback</code> argument added.
;Version 8.0
* Added: [[#fetch:xml{{Code|fetch:xml]]}}
The module was introduced with Version 7.6.