Kapitel 8. XPath-Einsatz

Allgemeine Erläuterungen zu XPath in PDFUnit

Die Nutzung von XPath zur Bestimmung von Teilen eines PDF-Dokumentes öffnet ein weites Feld von Testmöglichkeiten, das mit einer API alleine nicht abgedeckt werden kann.

Verschiedene Kapitel enthalten schon eine Beschreibung der XPath-Testfunktionen, sofern die Testbereiche XPath-Tests besitzen. Dieses Kapitel hier dient als Übersicht mit Verweisen zu den Spezialkapitel.

<!-- Overview over XPath related test facilities: -->

<hasBookmarks><matchingXPath />...     3.17: „Lesezeichen (Bookmarks) und Sprungziele“ 
<hasFields><matchingXPath />...        3.11: „Formularfelder“ 
<hasFonts><matchingXPath />...         3.19: „Schriften“ 
<hasSignatures><matchingXPath />...    3.21: „Signaturen und Zertifikate“ 
<hasXFAData><matchingXPath />...       3.29: „XFA Daten“ 
<hasXMPData><matchingXPath />...       3.30: „XMP-Daten“ 

<!-- Comparing two documents using XPath: --> 
<haveSameXFAData><matchingXPath />...  4.18: „XFA-Daten vergleichen“ 
<haveSameXMPData><matchingXPath />...  4.19: „XMP-Daten vergleichen“ 

Intern verwendet PDFUnit XPath auch für die Implementierung anderer Tests.

Interne Nutzung von XMLUnit

Alle Vergleiche von XML-Werte werden mit XMLUnit (http://xmlunit.sourceforge.net) durchgeführt. Dabei werden die Syntaxregeln von XML berücksichtigt werden, wie z.B.:

  • Die Reihenfolge von Attributen spielt keine Rolle.

  • Whitespaces zwischen Knoten werden ignoriert.

Weitere Regeln für Canonisches XML sind bei Wikipedia (http://de.wikipedia.org/wiki/Canonical_XML) gut beschrieben.

Die allgemeine Konfiguration von XMLUnit wird auf der Projektseite http://xmlunit.sourceforge.net/userguide/html/index.html#Configuring%20XMLUnit selber beschrieben. PDFUnit nutzt folgende Konfigurationsparameter:

XMLUnit.setXSLTVersion("2.0");
XMLUnit.setNormalizeWhitespace(true);
XMLUnit.setIgnoreWhitespace(true);
XMLUnit.setIgnoreAttributeOrder(true);
XMLUnit.setIgnoreComments(true);

Daten als XML extrahieren

Für alle Teile eines PDF-Dokumentes, für die es XML/XPath-Tests gibt, werden Extraktionsprogramme zur Verfügung gestellt:

// Utilities to extract XML from PDF:

com.pdfunit.tools.ExtractBookmarks
com.pdfunit.tools.ExtractFieldsInfo
com.pdfunit.tools.ExtractFontsInfo
com.pdfunit.tools.ExtractSignaturesInfo
com.pdfunit.tools.ExtractXFAData
com.pdfunit.tools.ExtractXMPData

Die Hilfsprogramme werden im Kapitel 9.1: „Allgemeine Hinweise für alle Hilfsprogramme“ genauer beschrieben.

Namensräume mit Präfix

Namensräume, für die ein Präfix definiert ist, werden von PDFUnit automatisch erkannt. Das gilt sowohl für XML-Dateien, als auch für PDF-internes XML.

Default-Namensraum

Der Default-Namensraum kann nicht automatisch ermittelt werden, weil es in einem XML-Dokument prinzipiell mehrere Default-Namensräume geben darf. Aus diesem Grund muss der Default-Namensraum im Test angegeben werden. Er kann mit einem beliebigen Präfix verwendet werden:

<!--
  The default namespace has to be declared, 
  but any alias can be used for it.
-->
<testcase name="hasXFAData_UsingDefaultNamespace">
  <assertThat testDocument="xfa/xfa-enabled.pdf">
    <hasXFAData>
      <withNode tag="foo:log/foo:to" 
                value="memory" 
                defaultNamespace="http://www.xfa.org/schema/xci/2.6/" 
      />
    </hasXFAData>
  </assertThat>
</testcase>

Beachten Sie, dass in diesem Beispiel einmal das Präfix foo und einmal das Präfix bar für den gleichen Namensraum verwendet wird. In der Praxis verwenden Sie bitte nur ein einziges und nicht foo oder bar.

Ergebnistypen von XPath-Ausdrücken

Die Auswertung von XPath-Ausdrücken führt zu bestimmten XPath-Datentypen, die beim Vergleich der XFA-Daten oder XMP-Daten zweier PDF-Dokumente mitgegeben werden müssen. Die verfügbaren Ergebnistypen sind als Konstanten für das Attribut withResultType definiert:

<!-- Result types for XPath-processing:  -->

withResultType="BOOLEAN"
withResultType="NUMBER"
withResultType="NODE"
withResultType="NODESET"
withResultType="STRING"

Test mit dem Ergebnistypen BOOLEAN sind insofern kritisch, weil XPath nicht zwischen nicht gefunden und false unterscheiden kann. Versuchen Sie mit einem anderen XPath-Ausdruck.

XPath-Kompatibilität

Für XPath-Ausdrücke stehen im Prinzip alle Syntaxelemente und Funktionen von XPath zur Verfügung. Allerdings ist die Menge der tatsächlich verfügbaren Funktionen von der Version des verwendeten XML-Parsers und XSLT-Prozessors abhängig. PDFUnit verwendet den vom JDK mitgelieferten XML-Parser bzw. XSLT-Prozessor (Standard JAXP). Insofern bestimmt die jeweils verwendete Java-Engine die Kompatibilität zum XPath-Standard.