【问题标题】:CData in simplexml opened from XMLReader从 XMLReader 打开的 simplexml 中的 CData
【发布时间】:2012-04-07 18:53:36
【问题描述】:

我有一堆 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

}

【问题讨论】:

    标签: php simplexml xmlreader


    【解决方案1】:

    你可以试试这样的:

    <?php
    $str = $dom->saveXML();
    $product = simplexml_load_string($str, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
    

    【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 2018-05-09
      • 2014-11-22
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多