簡體   English   中英

PHP XML DOM解析混合內容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM