【问题标题】:How to get values inside <![CDATA[values]] > using php DOM?如何使用 php DOM 在 <![CDATA[values]] > 中获取值?
【发布时间】: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);

标签: php xml


【解决方案1】:

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

以下是重要的类:

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

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

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

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

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

  1. 创建一个新的文档对象并加载 XML
  2. 通过标签名获取所有Destination元素并遍历列表
  3. 遍历每个Destination元素的所有子节点
  4. 检查节点类型是否为XML_CDATA_SECTION_NODE
  5. 如果是,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);

希望这对你有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多