簡體   English   中英

PHP使用DOMdocument更新xml CDATA字段

[英]PHP updating xml CDATA fields with DOMdocument

我有以下XML數據:

<?xml version="1.0" encoding="utf-8"?>
<source>
    <publisher>some-data</publisher>
    <publisherurl>some-data</publisherurl>
    <lastBuildDate>a-date</lastBuildDate>
    <element>
        <sub-element><![CDATA[some-data]]></sub-element>
    </element>
</source>

我正在嘗試使用PHP的內置DOMdocument解析器來更新sub-element內的文本。

我試過了:

$dom=new DOMDocument();
$dom->load("document.xml");

$ele=$root->getElementsByTagName('element');
foreach ($ele as $e) {
    $e->getElementsByTagName('sub-element')->item(0)->nodeValue = "new val";
}

這種工作,但它刪除了CDATA並僅用new-val替換了它。 我想保留CDATA字段,所以嘗試了以下操作:

$dom=new DOMDocument();
$dom->load("document.xml");

$ele=$root->getElementsByTagName('element');
foreach ($ele as $e) {  
    $sub=$e->getElementsByTagName('sub-element');   
    foreach($sub->childNodes as $child) {
        if ($child->nodeType == XML_CDATA_SECTION_NODE) {
            $child->nodeValue = 'new-val';
        }
    }
}

似乎應該可以使用,但是PHP返回以下通知

未定義的屬性:DOMNodeList :: $ childNodes

感覺自己走在正確的道路上,但我無法弄清楚自己在做什么錯。 有誰知道如何解決?

我的最終目標輸出是:

<?xml version="1.0" encoding="utf-8"?>
<source>
    <publisher>some-data</publisher>
    <publisherurl>some-data</publisherurl>
    <lastBuildDate>a-date</lastBuildDate>
    <element>
        <sub-element><![CDATA[new-val]]></sub-element>
    </element>
</source>

您需要與firstChild進行比較

$xml = '<?xml version="1.0" encoding="utf-8"?>
<source>
    <publisher>some-data</publisher>
    <publisherurl>some-data</publisherurl>
    <lastBuildDate>a-date</lastBuildDate>
    <element>
        <sub-element><![CDATA[some-data]]></sub-element>
    </element>
    <element>
        <sub-element>some-other-data</sub-element>
    </element>
</source>';

$dom = new DOMDocument();
$dom->loadXML($xml);

$ele=$dom->getElementsByTagName('element');
foreach ($ele as $e) {
    $item = $e->getElementsByTagName('sub-element')->item(0);
    if($item->firstChild->nodeType == XML_CDATA_SECTION_NODE) { //<------
        //it's CDATA do whatever
         $item->firstChild->nodeValue = "new val";
    } else {
        //it's not , do something else
        $item->nodeValue = "new val";
    }
}
echo "<pre>";
print_r(htmlentities($dom->saveXML()));
echo "</pre>";

輸出:

<?xml version="1.0" encoding="utf-8"?>
<source>
    <publisher>some-data</publisher>
    <publisherurl>some-data</publisherurl>
    <lastBuildDate>a-date</lastBuildDate>
    <element>
        <sub-element><![CDATA[new val]]></sub-element>
    </element>
    <element>
        <sub-element>new val</sub-element>
    </element>
</source>

PS:如果不必區分CDATA與否,只需使用firstChild

foreach ($ele as $e) {
    $item = $e->getElementsByTagName('sub-element')->item(0);
    $item->firstChild->nodeValue = "new val";
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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