如何使用 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->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]]>
我们将所有这些放在一起:
-
创建一个新的文档对象并加载 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>?