PHP 편집기 Baicao가 잘못된 XML 파일을 구문 분석하는 방법을 소개합니다. XML 파일을 처리할 때 형식이 올바르지 않거나 오류가 포함되어 잘못된 XML이 발생하는 경우가 있습니다. 잘못된 XML 파일을 구문 분석하는 것은 필요한 데이터를 올바르게 가져오는 데 중요한 작업입니다. 이 문제를 해결하기 위해 PHP에 내장된 함수와 라이브러리를 사용하여 잘못된 XML을 확인하고 수정할 수 있습니다. 아래에서는 유효하지 않은 XML 파일을 구문 분석하는 데 일반적으로 사용되는 몇 가지 방법을 자세히 소개합니다.
현재 다른 제품에서 받은 xml을 파싱하는 기능을 작업하고 있습니다. 일부 실제 고객 데이터에 대해 몇 가지 테스트를 실행하기로 결정했는데 다른 제품에서는 사용자가 유효하지 않은 것으로 간주되어야 하는 입력을 입력하도록 허용하는 것 같습니다. 어쨌든, 나는 여전히 그것을 분석하는 방법을 찾으려고 노력해야 합니다. javax.xml.parsers.documentbuilder
를 사용하고 있는데 입력하는 동안 다음 오류가 발생합니다.
아시다시피 설명에 잘못된 태그가 포함된 것 같습니다(d30036ddc824403d51b03f80ff62bdc4
)。现在,这个描述标签被认为是叶标签,并且内部不应该有任何嵌套标签。无论如何,这仍然是一个问题,并在 documentbuilder.parse(...)
이 XML이 유효하지 않다는 것을 알고 있지만 예상대로 유효하지 않습니다. 그러한 입력을 구문 분석하는 방법에 대한 아이디어가 있습니까?
"xml"은 잘못된 보다 더 나쁩니다. 잘못된 xml입니다. ; 잘 구성된 xml과 유효한 xml을 참조하세요.
위반 예측 가능성에 대한 비공식적 평가는 도움이 되지 않습니다. 텍스트 데이터가 xml이 아닙니다. 이를 처리하는 데 도움이 될 수 있는 일관된 XML 도구나 라이브러리가 없습니다.
공급업체가 직접 문제를 해결하도록 하세요. 잘 구성된 XML이 필요합니다. (기술적으로 well-formed xml이라는 용어는 중복되지만 강조하는 데 도움이 될 수 있습니다.)
XML로 구문 분석하기 전에 문제를 해결하려면 허용 태그 파서를 사용하세요.
독립 실행형: xmlstarlet 강력한 복구 및 복구 기능 포함 크레딧: romanperekhrest
으아악독립형 및 c/C++: html tidy 작동하며 xml도 사용할 수 있습니다. taggle은 C++에 대한 tagsoup의 포트입니다.
python: Beautiful Soup은 Python을 기반으로 합니다. 파서 간 차이점 섹션의 참고 사항을 참조하세요. 자세한 내용은 이 질문에 대한 답변을 참조하세요.
Python에서 잘못된 형식의 태그를 처리하는 방법에 대한 조언,
특히 lxml에 대한 recover=true
옵션 이 포함되어 있습니다.
이 답변을 참조하여 codecs.encodedfile()
를 사용하여 불법 문자를 삭제하는 방법을 알아보세요.
java: tagsoup 및 jsoup은 html에 중점을 둡니다. filterinputstream
전처리 정리에 사용할 수 있습니다.
.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 中。
위 내용은 잘못된(오류/잘못된) XML을 구문 분석하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!