13.5. Anführungszeichen in Suchbegriffen

Bedeutung von Double-Quotes in XML, XPath und Java

Zeichenketten in XML-Tags sind durch das Start- und Ende-Tag gekennzeichnet. Insofern dürfen die Inhalte von Tags beliebige Kombinationen von Single- und Double-Quotes enthalten.

Zeichenketten von XML-Attributen werden durch Single- oder Double-Quotes begrenzt. Soll der Wert eines XML-Attributs Double-Quotes enthalten, müssen Single-Quotes als äußere Begrenzer verwendet werden. Es können aber auch die Entitäten ' bzw " als Teil des Attributinhaltes verwendet werden.

Eine beliebige Verwendung von Single- und Double-Quotes in XPath-Ausdrücken ist nicht möglich, auch wenn dafür Entitäten benutzt werden. Am besten benutzen Sie Single-Quotes.

In Java werden Zeichenketten alleine durch Double-Quotes gekennzeichnet. Weil die XML-Tests zuerst in Java-Code umgewandelt und dann als Java-Programm ausgeführt werden, müssen Double-Quotes, die Teil einer Zeichenkette sind, in XML mit einem Backslash maskiert werden.

Unterschiedliche Arten von Anführungszeichen

Wichtiger Hinweis: Der Begriff Anführungszeichen wird in Texten unterschiedlich umgesetzt, wie das folgende Bild zeigt:

“Englische“ und „deutsche“ Anführungszeichen stören nicht während der Ausführung von Tests. Lediglich bei ihrer Erstellung könnten Sie das Problem haben, sie in Ihren Editor zu bekommen. Tipp: kopieren Sie die gewünschten Anführungszeichen von einem Textverarbeitungsprogramm oder einem bestehenden PDF-Dokument und fügen Sie sie dann in Ihren XML-Editor ein.

Die "programmers double quotes" benötigen eine besondere Aufmerksamkeit, weil sie sowohl in XML, als auch in Java als Zeichenkettenbegrenzer dienen. Die nachfolgenden Absätze und Beispiele gehen detailiert darauf ein, sie basieren alle auf dem folgenden Dokument:

Anführungszeichen in Tags

Single-Quotes in PDFUnit-Tags bereiten keine Probleme, Double-Quotes müssen mit einem Backslash maskiert werden:

<testcase name="tagWith_SingleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>Example 1: 'single quotes'</containing>
    </hasText>
  </assertThat>
</testcase>
<testcase name="tagWith_GermanDoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>Example 2: „German double quotes“</containing>
    </hasText>
  </assertThat>
</testcase>
<testcase name="tagWith_EnglishDoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>Example 3: “English double quotes“</containing>
    </hasText>
  </assertThat>
</testcase>
<testcase name="tagWith_ProgrammersDoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>Example 4: \"programmers double quotes\"</containing>
    </hasText>
  </assertThat>
</testcase>
<testcase name="tagWith_DoubleAndSingleQuotes_1">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>
        Example 5: \"double quotes outside, 'single quotes' inside\"
      </containing>
    </hasText>
  </assertThat>
</testcase>
<testcase name="tagWith_DoubleAndSingleQuotes_2">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <containing>Example 6: 'single quotes outside, \"double quotes\" inside'</containing>
    </hasText>
  </assertThat>
</testcase>

Anführungszeichen in Attributen

Single-Quotes in Attributen können ohne Einschränkung benutzt werden, wenn das Attribut außen durch Double-Quotes begrenzt ist. Und umgekehrt: wenn außen Single-Quotes verwendet werden, sind innen Double-Quotes möglich.

Die beiden folgenden Beispiele sind gültige Verwendungen von Single- und Double-Quotes in Attributen:

<testcase name="attributeWith_DoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasBookmark withLabel='"Double Quote"-Chapter' />
  </assertThat>
</testcase>
<testcase name="attributeWith_SingleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasBookmark withLabel="'Single Quote'-Chapter" />
  </assertThat>
</testcase>

Es ist aber nicht erlaubt, Single- und Double-Quotes gleichzeitig als Inhalt einer Zeichenkette zu benutzen, auch nicht in Form von Entitäten. Das nächste Beispiel ist daher ungültig:

<!-- 
  This example fails, because single- and double-quotes were used 
  inside the expected label.
-->

<testcase name="attributeWith_SingleDoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasBookmark withLabel="'Single &quot;Double&quot; Quote'-Chapter" />
  </assertThat>
</testcase>

Anführungszeichen in XPath-Ausdrücken

Da der XML-Code von PDFUnit-XML zuerst in Java-Code überführt wird und dort die Auswertung von XPath-Ausdrücken stattfindet, bestehen bei XPath-Ausdrücken die stärksten Einschränkungen für die Verwendung von Single- oder Double-Quote.

Das folgende Beispiel läst sich zwar in gültigen Java-Code umsetzen, liefert dann aber den Laufzeitfehler: One of the parameter contains single and double quote. You may use only one kind of quote.

<testcase name="attributeWithXPath_DoubleQuotes_1">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasBookmarks>
      <matchingXPath expr="count(//Title[.='\&quot;Double Quote\&quot;-Chapter']) = 1" />
    </hasBookmarks>
  </assertThat>
</testcase>

Der Fehler lässt sich nur vermeiden, wenn die XPath-Bedingung ohne Double-Quotes formuliert wird:

<testcase name="attributeWithXPath_DoubleQuotes_2">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasBookmarks>
      <matchingXPath expr="count(//Title[contains(., 'Double Quote')]) = 1" />
      <matchingXPath expr="count(//Title[contains(., 'Chapter')]) = 4" />
    </hasBookmarks>
  </assertThat>
</testcase>

Anführungszeichen in Regulären Ausdrücken

Weil auch die Auswertung von regulären Ausdrücken über den Zwischenschritt von generiertem Java-Code erfolgt, müssen alle Double-Quotes maskiert werden, wie im Tag matchingRegex des folgenden Beispiels:

<testcase name="regex_tag_DoubleQuotes">
  <assertThat testDocument="quotes/single-and-doublequotes.pdf">
    <hasText on="FIRST_PAGE">
      <matchingRegex>.*\"double.*</matchingRegex>
    </hasText>
  </assertThat>
</testcase>