Der PHP-Editor Baicao stellt Ihnen vor, wie Sie ungültige XML-Dateien analysieren. Bei der Verarbeitung von XML-Dateien stößt man manchmal auf ungültiges XML, möglicherweise weil es nicht wohlgeformt ist oder Fehler enthält. Das Parsen ungültiger XML-Dateien ist eine wichtige Aufgabe, um sicherzustellen, dass wir die erforderlichen Daten korrekt erhalten. Um dieses Problem zu lösen, können wir die in PHP integrierten Funktionen und Bibliotheken verwenden, um ungültiges XML zu überprüfen und zu reparieren. Im Folgenden stellen wir einige häufig verwendete Methoden zum Parsen ungültiger XML-Dateien im Detail vor.
Derzeit arbeite ich an einer Funktion, die das Parsen von XML beinhaltet, das wir von anderen Produkten erhalten. Ich habe beschlossen, einige Tests anhand tatsächlicher Kundendaten durchzuführen, und es sieht so aus, als ob andere Produkte es Benutzern erlauben, Eingaben einzugeben, die als ungültig betrachtet werden sollten. Wie auch immer, ich muss immer noch versuchen, einen Weg zu finden, es zu analysieren. Wir verwenden javax.xml.parsers.documentbuilder
und ich erhalte beim Tippen die folgende Fehlermeldung.
<xml> ... <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description> ... </xml>
Wie Sie vielleicht wissen, scheint die Beschreibung ein ungültiges Tag zu enthalten (d30036ddc824403d51b03f80ff62bdc4
)。现在,这个描述标签被认为是叶标签,并且内部不应该有任何嵌套标签。无论如何,这仍然是一个问题,并在 documentbuilder.parse(...)
eine Ausnahme wird generiert am
Ich weiß, dass dies eine ungültige XML-Datei ist, aber sie ist vorhersehbar ungültig. Irgendwelche Ideen, wie solche Eingaben analysiert werden können?
„xml“ ist schlimmer als ungültig – es ist nicht wohlgeformt ; siehe wohlgeformtes vs. gültiges XML.
Informelle Einschätzungen zur Vorhersehbarkeit von Verstößen sind nicht hilfreich. Die Textdaten sind kein XML. Es gibt kein konsistentes XML-Tool oder keine konsistente XML-Bibliothek, die Ihnen dabei helfen kann.
Lassen Sie den Anbieter das Problem selbst lösen. Erfordert wohlgeformtes XML. (Technisch gesehen ist der Begriff „wohlgeformtes XML“ überflüssig, kann aber bei der Hervorhebung hilfreich sein.)
, um Probleme vor dem Parsen in XML zu lösen:
xmlstarlet mit leistungsstarken Wiederherstellungs- und Reparaturfunktionen Credit: romanperekhrest
xmlstarlet fo -o -r -h -d bad.xml 2>/dev/null
HTML Tidy funktioniert und kann auch XML verwenden. taggle ist eine Portierung von Tagsoup nach C++.
Beautiful Soup basiert auf Python. Beachten Sie die Hinweise im Abschnitt „Unterschiede zwischen Parsern“. Weitere Informationen finden Sie auch unter Antwort auf diese Frage
Ratschläge zum Umgang mit fehlerhaften Tags in Python,
Speziell enthalten ist die -Option für lxml.
Sehen Sie sich auch diese Antwort an, um zu erfahren, wie Sie recover=true
verwenden, um illegale Zeichen zu bereinigen.
codecs.encodedfile()
und jsoup konzentrieren sich auf HTML. kann zur Bereinigung vor der Verarbeitung verwendet werden. filterinputstream
xmlreadersettings。 conformancelevel
可以设置为
conformancelevel.fragment
这样 xmlreader
可以读取缺少根元素的 xml 格式良好的解析实体 .xmlreader.readtofollowing()
有时可以
用于解决 xml 语法问题,但请注意
下面#3 中的违规警告。microsoft.language.xml.xmlparser
据说是“容错”的。转到:设置decoder.strict
到 false
,如示例所示,作者:@chuckx。
php:请参阅domdocument::$recover 和 libxml_use_internal_errors(true)。请参阅此处的好示例。
ruby:nokogiri 支持“温和的 well-形式性”。
r:请参阅htmltreeparse() 用于 r 中的容错标记解析。
perl:请参阅xml::liberal ,一个“超级自由的 xml 解析器,可以解析损坏的 xml。”
使用文本编辑器手动将数据处理为文本或 以编程方式使用字符/字符串函数。这样做 以编程方式可以从棘手到不可能作为 看起来是什么 可预测的往往不是——打破规则很少受到规则的约束。
对于无效字符错误,请使用正则表达式删除/替换无效字符:
preg_replace('/[^\x{0009}\x{000a}\x{000d} \x{0020}-\x{d7ff}\x{e000}-\x{fffd}]+/u', ' ', $s);
string.tr ("^\u{0009}\u{000a}\u{000d}\u{0020}-\u{d7ff}\u{e000}-\u{fffd}", ' ')
inputstr.replace (/[^\x09\x0a\x0d\x20-\xff\x85\xa0-\ud7ff\ue000-\ufdcf\ufde0-\ufffd]/gm, '')
对于与号,使用正则表达式将匹配项替换为 &
: 信用:blhsin,演示 p>
&(?!(?:#\d+|#x[0-9a-f]+|\w+);)
请注意,上述正则表达式不会接受注释或 cdata
按照设计,标准 xml 解析器永远不会接受无效的 xml。
您唯一的选择是在解析输入之前预处理输入以删除“可预见的无效”内容,或将其包装在 cdata 中。
Das obige ist der detaillierte Inhalt vonWie kann ich ungültiges (fehlerhaftes/fehlformatiertes) XML analysieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!