Editor PHP Baicao memperkenalkan anda cara menghuraikan fail XML yang tidak sah. Semasa memproses fail XML, anda kadangkala menghadapi XML yang tidak sah, mungkin kerana ia tidak terbentuk dengan baik atau mengandungi ralat. Menghuraikan fail XML yang tidak sah adalah tugas penting untuk memastikan kami mendapat data yang diperlukan dengan betul. Untuk menyelesaikan masalah ini, kami boleh menggunakan fungsi dan pustaka terbina dalam PHP untuk menyemak dan membetulkan XML yang tidak sah. Di bawah ini kami akan memperkenalkan secara terperinci beberapa kaedah yang biasa digunakan untuk menghuraikan fail XML yang tidak sah.
Pada masa ini, saya sedang mengusahakan ciri yang melibatkan penghuraian xml yang kami terima daripada produk lain. Saya memutuskan untuk menjalankan beberapa ujian terhadap beberapa data pelanggan sebenar dan nampaknya produk lain membenarkan pengguna memasukkan input yang sepatutnya dianggap tidak sah. Bagaimanapun, saya masih perlu mencuba mencari cara untuk menghuraikannya. Kami menggunakan javax.xml.parsers.documentbuilder
dan saya mendapat ralat berikut semasa menaip.
<xml> ... <description>Example:Description:<THIS-IS-PART-OF-DESCRIPTION></description> ... </xml>
Seperti yang anda ketahui, penerangan nampaknya mengandungi teg yang tidak sah (<this-is-part-of-description>
)。现在,这个描述标签被认为是叶标签,并且内部不应该有任何嵌套标签。无论如何,这仍然是一个问题,并在 documentbuilder.parse(...)
pengecualian dijana pada
Saya tahu ini xml tidak sah, tetapi boleh diramalkan tidak sah. Sebarang idea tentang cara untuk menghuraikan input tersebut?
"xml" lebih teruk daripada tidak sah - ia tidak terbentuk dengan baik ; lihat berbentuk baik berbanding xml yang sah.
Penilaian tidak formal tentang kebolehramalan pelanggaran tidak membantu. Data teks bukan xml. Tiada alat atau pustaka xml yang konsisten yang boleh membantu anda menanganinya.
Biar penyedia menyelesaikan sendiri isu tersebut. Memerlukan xml yang dibentuk dengan baik. (Secara teknikal, istilah xml yang dibentuk dengan baik adalah berlebihan, tetapi boleh membantu dengan penekanan.)
Gunakan penghurai tag toleranuntuk menyelesaikan isu sebelum menghuraikan ke xml:
Kendiri: xmlstarlet dengan ciri pemulihan dan pembaikan yang berkuasa Kredit: romanperekhrest
xmlstarlet fo -o -r -h -d bad.xml 2>/dev/null
Stand-alone and c/c++: html tidy berfungsi dan boleh juga menggunakan xml. taggle ialah pelabuhan tagsoup ke c++.
python: Sup Cantik berasaskan ular sawa. Lihat nota dalam bahagian Perbezaan antara penghurai. Lihat juga Jawapan kepada soalan iniuntuk maklumat lanjut
Nasihat mengenai pengendalian tag yang cacat dalam python,
Disertakan secara khusus ialah pilihan recover=true
untuk lxml.
Lihat juga jawapan iniuntuk mempelajari cara menggunakan codecs.encodedfile()
untuk membersihkan watak haram.
java: tagsoup dan jsoup fokus pada html. filterinputstream
boleh digunakan untuk pembersihan pra-pemprosesan.
.net:
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 中。
Atas ialah kandungan terperinci Bagaimana untuk menghuraikan XML yang tidak sah (ralat/cacat)?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!