【问题标题】:PHP XmlReader - Read error while parsingPHP XmlReader - 解析时读取错误
【发布时间】:2013-06-04 13:48:43
【问题描述】:

要读取 XML 文件,请使用:

$XMLFile = new XMLReader();

if($XMLFile->open('file.xml') === TRUE){                            

    while($XMLFile->read()) {

        //Do something

    }

    $XMLFile->close();

}

如果我会在 xml 文件中找到示例字符串:

!+_)(*&^%$#@!~}|"?,../;'\[]=-

显示严重错误并终止解析:

Warning: XMLReader::read() [xmlreader.read]: file.xml:16: parser error : xmlParseEntityRef: no name in test.php on line 841
Warning: XMLReader::read() [xmlreader.read]: An Error Occured while reading in test.php on line 841

在这种情况下,我想处理错误并删除 xml 文件。有人可能知道如何解决此错误?

【问题讨论】:

    标签: php xml xmlreader


    【解决方案1】:

    使用XMLReader::isValid()

    <?php $xml = XMLReader->open('file.xml');
    
    // You have to use this:
    $xml->setParserProperty(XMLReader::VALIDATE, true);
    
    var_dump($xml->isValid());
    ?>
    

    【讨论】:

    • 现在我有新错误:有效性错误:验证失败:未找到 DTD!
    • 对于 XML,有“有效”和“格式正确”之分。对于格式正确,一般语法必须正确(匹配标签、正确格式)。为了有效,它必须格式正确并且必须遵守 DTD。没有 DTD,它只能是格式良好的,但永远不会有效。
    • 除了其他 cmets,XMLReader-&gt;open 无效。您需要先创建一个 XMLReader 的实例(以防其他人希望这可能是打开 XML 文件的简写)。
    【解决方案2】:

    有许多不同的方法来处理您那里的错误情况。但首先我认为你应该知道XMLReader 是基于libxmllibxml offers various functions 甚至LibXMLError object 的错误处理:

    $reader = new XMLReader();
    if (!$reader->open($file)) {
        throw new RuntimeException('Unable to open file.');
    }
    
    while ($reader->read()) {
        //Do something
    }
    
    if (libxml_get_last_error()) {
        // There was an error reading the file
        unlink($file);
    }
    

    错误信息示例为:

    LibXMLError Object
    (
        [level] => 3
        [code] => 68
        [column] => 12
        [message] => xmlParseEntityRef: no name
    
        [file] => /path/to/file.xml
        [line] => 2
    )
    

    对于这个示例 XML 文件:

    <root>
        !+_)(*&^%$#@!~}|"?,../;'\[]=-
    </root>
    

    如果你想减少错误输出,你可以在libxml中使用一个叫做internal errors的东西。

    参见:

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。问题是您的 XML 无效。您不应该在 XML 中有特殊字符(即 & 应该在 XML 文件生成期间转换为 &)。

      更多信息,你可以看到this类似的问题。

      你基本上有两种选择:

      1. 您可以在解析之前修复文件(例如使用正则表达式)
      2. 您可以首先修复生成 XML 的代码

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-04
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-27
        • 1970-01-01
        相关资源
        最近更新 更多