3

我有一堆 XML 文件,我正在使用 XMLReader 将它们加载到我的脚本中,创建 DOM 对象,然后转换为 Simplexml。

问题是其中一个 XML 文件使用了 SIMPLEXML 忽略的 CDATA,通常使用 SIMPLEXML_LOAD_FILE 我会添加 LIBXML_NOCDATA 参数,但由于我使用的是 simplexml_import_dom,所以我无法弄清楚如何在下面的场景中忽略 CDATA。

请问有什么想法吗?

非常感谢布雷特

$file = 'test.xml';
$reader = new XMLReader();
$reader->open($file);       
while ($reader->read())
{
    // are we in a product?
    if ($reader->nodeType == XMLReader::ELEMENT &&
        strtolower($reader->localName) == 'product')

    {
        if (!$node = $reader->expand()) {
            //do nothing 
        }
        else {
             // expand the node into a DOMNode
        // Convert to SimpleXML via DOM, messy but SimpleXML is soo much nicer.
        $dom  = new DomDocument();
        $dom->appendChild($dom->importNode($node, true));
        $products = simplexml_import_dom($dom);

        // do whatever we want to do with the product data

}
4

2 回答 2

4

您可以尝试以下方法:

<?php
$str = $dom->saveXML();
$product = simplexml_load_string($str, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
于 2013-09-25T06:04:18.423 回答
1

关于 SimpleXML 对 CDATA 节点的处理似乎存在很多混淆和错误信息。它不会“忽略” CDATA,它只是通过将特定节点表示为对象而不是纯字符串来记住 CDATA 中的特定节点。

如果您始终遵循将 SimpleXML 的返回值显式转换为字符串的良好做法,您应该可以很好地看到 CDATA 的内容。

有关更多信息,请参阅http://php.net/function.simplexml-load-string.php#84365

或者,LIBXML_NOCDATA您提到的参数可以传递给simplexml_load_string. 如果您出于其他原因确实需要 XMLReader,您可能可以使用$reader->readOuterXML()而不是通过DOMDocument.

于 2012-07-19T00:18:53.363 回答