如何通过simplexml修改php中加载的xml文档的整体部分?

时间:2015-11-06 14:41:47

标签: php xml simplexml

假设以下xml文档     

<technicaldata template="123">

<name>
<![CDATA[Blub1]]>
</name>


<numbers>

<![CDATA[1
2
3
4
5]]>
</numbers>

<shortinfo>

<![CDATA[ha ha ha ha ha ha ha ha.]]>
</shortinfo>

<detailedinfo>

<![CDATA[hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi
hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi
hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi]]>
</detailedinfo>


</technicaldata>

现在我通过simplexml加载文件;

$data='test.xml';
$inhalt = simplexml_load_file($datei);

但现在$ inhalt是一个我无法使用的对象,例如str_ireplace(string remove,string add,$ inhalt); 所以如果我,例如想要替换我需要进入xml文档的每个正文部分的东西,以便能够替换它;

所以我这样做:

$name = $inhalt->name;
$name = str_ireplace(string remove, string add,$name);

$numbers = $inhalt ->numbers;
$numbers = str_ireplace(string remove, string add,$numbers);

$shortinfo=$inhalt ->shortinfo;
str_ireplace(string remove, string add,$shortinfo);

$detailedinfo=$inhalt ->detailedinfo;
str_ireplace(string remove, string add,$detailedinfo);

等等;

那么你有什么想法我可以替换整个身体部位的东西而不仅仅是它的一部分吗?所以有些版本:

$inhalt = str_ireplace(string remove, string add,$inhalt);

在这种情况下不起作用?

抱歉,我知道这听起来很容易而且很愚蠢,但我是一个血腥的初学者;

非常感谢!! :)

2 个答案:

答案 0 :(得分:0)

你可以循环遍历你的xml对象的所有子代:

foreach ($inhalt->children() as $child) {
    $child= str_ireplace(string remove, string add,$child);
}

希望有所帮助

答案 1 :(得分:0)

这在DOM中更容易,因为您可以直接寻址和修改文本节点(包括CDATA部分):

$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXpath($document);

foreach ($xpath->evaluate('/technicaldata/*//text()') as $textNode) {
  $textNode->data = str_replace(['hi', 'ha'], ['foo', 'bar'], $textNode->data);
}

echo $document->saveXml();

Xpath表达式

technicaldata文档元素中获取任何元素节点...

/technicaldata/*

...在其中获取文本节点(简单文本或cdata部分):

/technicaldata/*//text()