[FIXED] Wie analysiert man ungültiges (schlechtes / nicht wohlgeformtes) XML?

Ausgabe

Derzeit arbeite ich an einer Funktion, bei der XML analysiert wird, die wir von einem anderen Produkt erhalten. Ich habe mich entschieden, einige Tests mit einigen tatsächlichen Kundendaten durchzuführen, und es sieht so aus, als ob das andere Produkt Eingaben von Benutzern zulässt, die als ungültig betrachtet werden sollten. Wie auch immer, ich muss noch versuchen, einen Weg zu finden, es zu analysieren. Wir verwenden javax.xml.parsers.DocumentBuilderund ich erhalte einen Fehler bei der Eingabe, der wie folgt aussieht.

<xml>
  ...
  <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description>
  ...
</xml>

Wie Sie sehen können, enthält die Beschreibung ein scheinbar ungültiges Tag ( <THIS-IS-PART-OF-DESCRIPTION>). Nun, dieses Beschreibungs-Tag ist als Blatt-Tag bekannt und sollte keine verschachtelten Tags enthalten. Unabhängig davon ist dies immer noch ein Problem und führt zu einer AusnahmeDocumentBuilder.parse(...)

Ich weiß, dass dies ungültiges XML ist, aber es ist vorhersehbar ungültig. Irgendwelche Ideen, wie man solche Eingaben analysieren kann?

Lösung

Dieses „XML“ ist schlimmer als ungültig – es ist nicht wohlgeformt ; siehe Wohlgeformtes vs. gültiges XML .

Eine informelle Einschätzung der Vorhersehbarkeit der Überschreitungen hilft nicht weiter. Diese Textdaten sind kein XML. Keine konformen XML-Tools oder -Bibliotheken können Ihnen bei der Verarbeitung helfen.

Optionen, am wünschenswertesten zuerst:

  1. Lassen Sie den Anbieter das Problem auf seiner Seite beheben. Fordern Sie wohlgeformtes XML. (Technisch gesehen ist der Ausdruck wohlgeformtes XML überflüssig, kann aber zur Hervorhebung nützlich sein.)

  2. Verwenden Sie einen toleranten Markup-Parser , um das Problem vor dem Parsen als XML zu bereinigen:

  3. Verarbeiten Sie die Daten als Text manuell mit einem Texteditor oder programmgesteuert mit Zeichen-/String-Funktionen. Dies programmgesteuert zu tun kann schwierig bis unmöglich sein, da das, was vorhersehbar erscheint, es oft nicht ist – Regelverstöße sind selten an Regeln gebunden .

    • Verwenden Sie bei Fehlern aufgrund ungültiger Zeichen Regex, um ungültige Zeichen zu entfernen/ersetzen:

      • PHP: preg_replace('/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', ' ', $s);
      • Rubin: string.tr("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{D7FF}\u{E000‌​}-\u{FFFD}", ' ')
      • Javascript: inputStr.replace(/[^\x09\x0A\x0D\x20-\xFF\x85\xA0-\uD7FF\uE000-\uFDCF\uFDE0-\uFFFD]/gm, '')
    • Verwenden Sie für kaufmännische Und- Zeichen Regex, um Übereinstimmungen mit &amp;: credit: blhsin , demo zu ersetzen

      &(?!(?:#\d+|#x[0-9a-f]+|\w+);)
      

Beachten Sie, dass die obigen regulären Ausdrücke keine Kommentare oder CDATA-Abschnitte berücksichtigen.


Beantwortet von –
kjhughes


Antwort geprüft von –
Candace Johnson (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like