gpt4 book ai didi

php - 如何在 PHP 中使用 Simplexml 解析有错误的 XML 文件?

转载 作者:行者123 更新时间:2023-12-04 05:05:03 25 4
gpt4 key购买 nike

所以我在PHP中使用simplexml进行XML解析,但是我发现我需要解析的一些文件包含错误。当然,我可以手动编辑每个有问题的文件,但是在大约 10000 多个文件中,这将花费我永远。

好的,关于错误。当您尝试在浏览器中打开 XML 文件时,会显示以下消息:

Specification mandate value for attribute error

Warning: simplexml_load_string(): Entity: line 2: parser error : Specification mandate value for attribute Inspection in ...



我找到了 ff。标签正在触发错误(此处:传输而不是检查):
<Public Transport Rules>
<PublicTransport id="0">
<Issued>null</Issued>
<Files>&lt;localfile&gt;
&lt;location&gt;Citybus&lt;/location&gt;
&lt;format&gt;Events&lt;/format&gt;
&lt;/localfile&gt;
</Files>
</PublicTransport>
</Public Transport Rules>

标签内的空格显然是导致问题的原因。这些标签在文件中出现不止一次。

我认为 simplexml根据它在浏览器中看到的内容(表面值(value))进行解析,因此如果您的 XML 文件有问题,它将无法正常解析。我想通过读取源文件来进行 PHP 解析,也许可以从那里编辑文件。但似乎任何 fopens打开您在浏览器页面中阅读的内容。

被这个问题困住了一段时间。任何建议将不胜感激。

谢谢!

最佳答案

DOM 函数旨在处理无效标记,因此您可以尝试一下:

<?php

$string = '<?xml version="1.0" ?>
<Public Transport Rules>
<PublicTransport id="0">
<Issued>null</Issued>
<Files>&lt;localfile&gt;
&lt;location&gt;Citybus&lt;/location&gt;
&lt;format&gt;Events&lt;/format&gt;
&lt;/localfile&gt;
</Files>
</PublicTransport>
</Public>';

$dom = new DOMDocument;
libxml_use_internal_errors(TRUE);
$dom->loadHTML($string);
libxml_use_internal_errors(FALSE);
$dom->formatOutput = TRUE;

echo '::: Original XML :::' . PHP_EOL;
echo $string . PHP_EOL;
echo PHP_EOL;

echo '::: Fixed XML :::' . PHP_EOL;
if( version_compare(PHP_VERSION, '5.3.6', '>=') ){
$body = $dom->documentElement->firstChild;
if( $body->hasChildNodes() ){
foreach($body->childNodes as $node){
echo $dom->saveHTML($node);
}
}
}else{
$body = $dom->getElementsByTagName('body')->item(0);
if( $body->hasChildNodes() ){
foreach($body->childNodes as $node){
echo $dom->saveHTML($node);
}
}
}
echo PHP_EOL;

...打印这个:
::: Original XML :::
<?xml version="1.0" ?>
<Public Transport Rules>
<PublicTransport id="0">
<Issued>null</Issued>
<Files>&lt;localfile&gt;
&lt;location&gt;Citybus&lt;/location&gt;
&lt;format&gt;Events&lt;/format&gt;
&lt;/localfile&gt;
</Files>
</PublicTransport>
</Public>

::: Fixed XML :::
<public transport rules><publictransport id="0"><issued>null</issued><files>&lt;localfile&gt;
&lt;location&gt;Citybus&lt;/location&gt;
&lt;format&gt;Events&lt;/format&gt;
&lt;/localfile&gt;
</files></publictransport></public>

没有办法知道在这个过程中会丢失什么,但我们首先要处理无效数据。

无论如何,您始终可以使用 PHP 自动编辑每个有问题的文件。您的文件可能不是 XML,但它们确实是字符串 ;-)

关于php - 如何在 PHP 中使用 Simplexml 解析有错误的 XML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15620492/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com