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

时间:2011-07-13 05:05:56

标签: php xml

如何获取&lt;![CDATA [values]]&gt;内的值?使用php DOM。 这是我的xml中的一些代码。

     <Destinations>

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

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

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

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

  </Destinations>

5 个答案:

答案 0 :(得分:31)

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

以下是重要的课程:

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

有一些主要方法和属性:

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

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

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

将这一切放在一起我们:

  1. 创建新文档对象并加载XML
  2. 按标记名称获取所有Destination个元素并遍历列表
  3. 迭代每个Destination元素的所有子节点
  4. 检查节点类型是否为XML_CDATA_SECTION_NODE
  5. 如果是,echo该节点的textContent
  6. <强>代码:

    $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,Skiatos,希腊
      西班牙阿梅特拉   Amoliani,希腊
      鲍勃林根,德国

答案 1 :(得分:10)

使用此:

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

和下一个:

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

答案 2 :(得分:3)

最简单方法

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

答案 3 :(得分:2)

在解析PHP DOM元素之前使用替换CDATA,之后可以获取innerXml或innerHtml:

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

答案 4 :(得分:1)

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

读取所有xml数据
[edu12]

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

<![CDATA[values]] > 

希望这对你有用。