Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP使用DOMdocument更新xml CDATA字段_Php_Xml_Domdocument_Cdata - Fatal编程技术网

PHP使用DOMdocument更新xml CDATA字段

PHP使用DOMdocument更新xml CDATA字段,php,xml,domdocument,cdata,Php,Xml,Domdocument,Cdata,我有以下XML数据: <?xml version="1.0" encoding="utf-8"?> <source> <publisher>some-data</publisher> <publisherurl>some-data</publisherurl> <lastBuildDate>a-date</lastBuildDate> <element>

我有以下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>
这种方法可以工作,但它会删除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返回以下注意

未定义的属性:DomainNodeList::$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>

一些数据
一些数据
约会

您需要与第一个孩子进行比较

$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 = '<?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>";

我想要的输出是这样的:
我该怎么做?
$item->firstChild->nodeValue=“new val”编辑,看一看或者如果可以忽略比较并一直使用
第一个孩子
,我要查找的输出将是:
我该怎么做?
$item->firstChild->nodeValue=“new val”
Edited,查看一下,或者干脆忽略比较,一直使用
firstChild
<?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>
foreach ($ele as $e) {
    $item = $e->getElementsByTagName('sub-element')->item(0);
    $item->firstChild->nodeValue = "new val";
}