2010-12-02 13 views
0

Gibt es einen XQuery-Befehl zum Laden einer Textdatei?Wie lade ich eine Textdatei aus einem XQuery?

Ich kann ein XML-Dokument laden, indem Sie folgendermaßen vorgehen;

declare variable $text := doc("test.xml"); 

Aber es scheint nur zu funktionieren, wenn test.xml ein wohlgeformtes XML-Dokument ist. Ich möchte eine einfache test.txt-Datei in eine String-Variable laden. Etwas wie das;

declare variable $str as xs:string := fn:loadfile("test.txt"); 

Kann es getan werden?

Ich benutze den Saxon-Motor, aber ich finde keine Antwort in der Sächsischen Dokumentation.

+0

Ich denke, die Antwort ist Nein mit einer Standardfunktion. Die Funktion 'unparsed-text()' ist eine reine XSLT-Funktion. –

Antwort

1

Dafür gibt es einen Standardisierungsaufwand auf EXPath. Eine Spezifikation existiert bereits für ein XQuery-Dateimodul, das in der Lage ist, das zu tun, was Sie beschreiben: EXPath File Module Spec.

Noch weiß ich nicht, wie viele Implementierungen da draußen sind. Saxon scheint es leider nicht umzusetzen (Oder, bitte zeigen Sie mir darauf). Eine Beispielimplementierung wird mit zorba ausgeliefert (siehe XQDoc Site of Zorba). Wenn Sie wissen möchten, wie Sie mit zorba beginnen, können Sie dieses Tutorial ausprobieren: Get Started with XQuery and Zorba.

2

XQuery 3.0 hat die Funktion fn:unparsed-text (die ursprünglich in XSLT definiert wurde), das ist genau das tut, was Sie wollen. XQuery 3.0 ist zwar noch in Arbeit, aber obwohl nicht viele XQuery 3.0-Prozessoren verfügbar sind, unterstützen bereits viele XQuery-Prozessoren diese Funktion (einschließlich Saxon).

+0

Danke. Das klingt genau nach dem, was ich brauche, aber wenn ich es benutze, erhalte ich einen Fehler "System function unparsed-text # 1 ist in dieser Sprache nicht verfügbar". Auch die Saxon-Dokumentation für fn: unparsed-text() enthält einen Disclaimer, der besagt: "Die aktuelle Saxon-Implementierung ist nicht stabil: Wenn die Funktion zweimal mit demselben Argument aufgerufen wird, liest sie die externe Datei zweimal und kann verschiedene Ergebnisse zurückgeben wenn es sich geändert hat. " –

+0

Sie sollten sagen, dass XQuery 3.0 ein Arbeitsentwurf ist: noch vor ein paar Monaten hatte es eine andere Versionsnummer ... –

+0

@Alejandro - Guter Punkt.Ich habe diese Änderung vorgenommen. –

0

XQuery standardmäßig (bedeutet Fn: Namespace) hat keine Dateizugriffsmethoden.

Marklogic: xdmp: Dateisystem-Datei() xdmp: Dateisystem-Verzeichnis()

Zorba: bereits erwähnt von user457056

Exist Exist File Module

0

Saxon seit Version 9.2 eine hat Erweiterung von Fn: Sammlung, die verwendet werden kann, um ungeparsten Text zu lesen. Hier ein Beispiel:

collection('file:///c:/TEMP?select=text.txt;unparsed=yes') 

Dies ist für 9.2 unter "Changes in this Release" beschrieben. Anscheinend wird es in der Dokumentation der Funktionsbibliothek nicht erwähnt. Aber es funktioniert gut und ich habe es oft benutzt.