[英]PHP XML DOM parseing mixed content
我有一個用XSD文件很好定義的XML文檔。 xml文檔包含與以下內容相似的內容:
<foo>
<bar>text <element a="1" b="2" c="3" /> and some more text</bar>
<bar>Just text</bar>
</foo>
我想使用PHP對其進行解析,以便只將其中一個屬性值(將在代碼的其他位置決定)帶回文本的其余部分,對於此示例,我希望使用“ B”,並且輸出應為:
"text 2 and some more text"
"Just text"
我在以這種格式獲取輸出時遇到問題,因為我找不到拆分節點文本的方法,因此無法插入屬性值或輸出節點的純xml。
我的偏好是使用PHP的DOMDocument方法來執行此操作。 盡管我還沒有學習過XPath,但如果它使這項任務成為可能,我將樂於學習。 我也將考慮更改嵌套節點的格式,盡管這將是最后的選擇。
我正在使用DOMdocument查找節點:
$xml= new DOMDocument();
$xml->load(XMLPATH);
$node = $xml->getElementsByTagName("element")->item(0);
然后,以下所有內容都會忽略嵌套元素:
$node->nodeValue;
$node->C14N();
我也無濟於事地遵循了本指南: 如何獲取DOMNode的innerHTML?
謝謝你的幫助。
您可以使用XPath選擇text()
節點,並使用@b
選擇屬性和聯合運算符|
將以正確的順序顯示所有內容:
$xml = <<<EOD
<foo>
<bar>text <element a="1" b="2" c="3" /> and some more text</bar>
<bar>Just text</bar>
</foo>
EOD;
$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
$nodeList = $xpath->query('//foo//text() | //foo//element/@b', $doc);
$result = '';
for ($i = 0; $i < $nodeList->length; $i++) {
$result .= $nodeList[$i]->textContent;
}
echo $result;
結果是
text 2 and some more text
Just text
以下代碼應該使您了解如何不使用XPath來實現目標:
<?php
$xml = '<foo>
<bar>text <element a="1" b="2" c="3" /> and some more text</bar>
<bar>Just text</bar>
</foo>'; // Your example XML.
$attr = 'b'; // Attribute of <element> you are interested in.
$doc = new DOMDocument();
$doc->loadXml($xml);
foreach($doc->documentElement->getElementsByTagName('bar') as $bar)
{
$text = '';
foreach($bar->childNodes as $child)
{
switch($child->nodeType)
{
case XML_ELEMENT_NODE:
if($child->nodeName == 'element')
$text .= $child->getAttribute($attr);
break;
case XML_TEXT_NODE:
$text .= $child->textContent;
break;
}
}
echo $text . PHP_EOL;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.