如何使用 php DOM 在 <![CDATA[values]] > 中获取值?

Posted

技术标签:

【中文标题】如何使用 php DOM 在 <![CDATA[values]] > 中获取值?【英文标题】:How to get values inside <![CDATA[values]] > using php DOM? 【发布时间】:2011-10-04 04:44:10 【问题描述】:

如何使用 php DOM 在 中获取值。 这是我的 xml 中的一些代码。

     <Destinations>

        <Destination>
            <![CDATA[Aghia Paraskevi, Skiatos, Greece]]>
            <CountryCode>GR</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Amettla, Spain]]>
            <CountryCode>ES</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Amoliani, Greece]]>
            <CountryCode>GR</CountryCode>
        </Destination>

        <Destination>
            <![CDATA[Boblingen,  Germany]]>
            <CountryCode>DE</CountryCode>
        </Destination>

  </Destinations>

【问题讨论】:

您是否正在尝试读取或写入此 XML?无论哪种方式,您真的想要那些在发布时翻倍的 CDATA 部分吗? 我想读取 CDATA 中的值。 您可以使用一些选项,例如:$xml = simplexml_load_string($Your_XML_String, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS); 【参考方案1】:

使用 PHP DOM 相当简单,与 javascript 的 DOM 非常相似。

以下是重要的类:

DOMNode — 可以在 XML/html 文档中遍历的任何内容的基类,包括文本节点、注释节点和 CDATA 节点 DOMElement标签的基类。 DOMDocument — 文档的基类。包含加载/保存 XML 的方法,以及普通的 DOM 文档方法(见下文)。

有几个主要的方法和属性:

DOMDocument-&gt;load() — 创建新的 DOMDocument 后,在该对象上使用此方法从文件加载。 DOMDocument-&gt;getElementsByTagName() — 此方法返回文档中具有给定标签名称的所有元素的节点列表。然后您可以在此列表上迭代 (foreach)。 DOMNode-&gt;childNodes — 一个节点的所有子节点的节点列表。 (请记住,CDATA 部分是一个节点!) DOMNode-&gt;nodeType — 获取节点的 type。 CDATA 节点的类型为 XML_CDATA_SECTION_NODE,它是一个值为 4 的常数。 DOMNode-&gt;textContent — 获取任意节点的文本内容。

注意:您的 CDATA 部分格式不正确。我不知道为什么第一个有一个额外的]],或者在行尾有一个未关闭的 CDATA 部分,但我认为它应该只是:

<![CDATA[Aghia Paraskevi, Skiatos, Greece]]>

我们将所有这些放在一起:

    创建一个新的文档对象并加载 XML 通过标签名获取所有Destination元素并遍历列表 遍历每个Destination元素的所有子节点 检查节点类型是否为XML_CDATA_SECTION_NODE 如果是,echo 是那个节点的textContent

代码:

$doc = new DOMDocument();
$doc->load('test.xml');
$destinations = $doc->getElementsByTagName("Destination");
foreach ($destinations as $destination) 
    foreach($destination->childNodes as $child) 
        if ($child->nodeType == XML_CDATA_SECTION_NODE) 
            echo $child->textContent . "<br/>";
        
    

结果:

Aghia Paraskevi,斯基亚托斯,希腊 西班牙阿梅特拉 希腊阿莫利亚尼 德国博布林根

【讨论】:

Hearaman 想要读取包含 CDATA 的节点,而不是创建包含 cdata 的节点。 @JellyBelly 我最初误解了它。我已经确定了答案。 如果 CDATA 包含 HTML,请注意这不起作用,它只输出纯文本。【参考方案2】:

使用这个:

$parseFile = simplexml_load_file($myXML,'SimpleXMLElement', LIBXML_NOCDATA)

接下来:

foreach ($parseFile->yourNode as $node )
etc...

【讨论】:

虽然在上面的答案的阴影下,这个真的很有用,特别是对于我们开始使用simplexml进行开发的我们。谢谢!【参考方案3】:

最简单的方法

$xml = simplexml_load_string($xmlData, 'SimpleXMLElement', LIBXML_NOCDATA);
$xmlJson = json_encode($xml);
$xmlArr = json_decode($xmlJson, 1); // Returns associative array

【讨论】:

完美答案。 +1 这为我节省了很多时间。【参考方案4】:

在解析 PHP DOM 元素之前使用 replace CDATA 之后可以得到 innerXml 或 innerHtml:

str_replace(array('<\![CDATA[',']]>'), '', $xml);

【讨论】:

您应该使用示例代码完成示例以检索 innerXml 或 innerHtml... 如果使用此方案,则不需要其中的 \ 字符。【参考方案5】:

我使用以下代码。 它不仅使用

读取所有 xml 数据
<![CDATA[values]] > 

还可以将 xml 对象转换为 php 关联数组。所以我们可以对数据应用循环。

$xml_file_data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA),true), true);

希望这对你有用。

【讨论】:

以上是关于如何使用 php DOM 在 <![CDATA[values]] > 中获取值?的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP Regex 或 DOM,如何在标签之间使用 eol 或换行符获取网页的 <TITLE>?</TITLE>?

如何在 PHP 中使用 DOM 或 XPATH 获取最近的子节点而不是嵌套的子节点

如何使用 PHP Simple HTML DOM Parser 在 HTML 文件中找到最后一个 <div class>?

如何使用 PHP DOM 从网页中提取关键字

在 PHP 中,如何使用 querySelector 方法访问 dom 并打印出它的 nodeValue 或值?

包含 ∈ 的 XML 文档无效 - 如何使用 XSLT 输出?