有人可以帮我解决这个问题吗?我正在尝试在下面的XML中找到一个孩子,一旦找到它,我需要更新同一父节点中的另一个孩子。它可以是simpleXML或XDOM - 使用两者我设法找出如何找到项目,但我无法弄清楚如何更新同一父项中的另一个孩子。
所以在下面的例子中,我想首先找到技能'数学'并将'等级'更新为其他数字。
XML:
<map>
<competency>
<level>5</level>
<skill name="Maths">
<skillinfo> "some value" </skillinfo>
</skill>
<competency>
</map>
So far I've:
$dom = new DOMDocument;
$dom->loadXML($data);
$xpath = new DomXpath($dom);
我真的不需要for循环,因为该技能只在XML中出现一次,所以更像IF这个技能存在然后更新级别。
foreach ($xpath->query('//skill[@name="Maths"]') as $item) {
echo $item->nodeValue;
// how to update the child 'Level'?
}
一旦做出更改,我就需要将更改附加到XML文件。
问题的第二部分:
如何使用DOM输出XML文件中的所有内容。
下面有效,但只显示父母下的子VALUES但是我要输出的是这个例子中的名称值。
$dom = new DOMDocument;
$dom->loadXML($data);
$xpath = new DomXpath($dom);
$x = $dom->documentElement;
foreach ($x->childNodes AS $item){
print $item->nodeName . " = " . $item->nodeValue . "<br />";
}
答案 0 :(得分:1)
您可以使用it parentNode属性,然后循环所有子项。如下:
$data = '<map><competency><level>5</level><skill name="Maths"><skillinfo>"some value"</skillinfo></skill></competency></map>';
$dom = new DOMDocument;
$dom->loadXML($data);
$xpath = new DomXpath($dom);
foreach ($xpath->query('//skill[@name="Maths"]') as $item) {
foreach($item->parentNode->childNodes as $node)
if ($node->tagName == 'level')
$node->nodeValue = @WhatEverValueYouWant@;
}
$xml_string = $dom->saveXML();
echo $xml_string;
答案 1 :(得分:0)
您可以直接获取level
节点并更改其文本内容。
competency
documetn元素中获取map
个元素... /map/competency
skill
元素,带有name
属性&#34;数学&#34; ......
/map/competency[skill/@name="Maths"]
level
子元素/map/competency[skill/@name="Maths"]/level
示例:
$data = <<<'XML'
<map>
<competency>
<level>5</level>
<skill name="Maths">
<skillinfo> "some value" </skillinfo>
</skill>
</competency>
</map>
XML;
$document = new DOMDocument;
$document->loadXML($data);
$xpath = new DomXpath($document);
$expression = '/map/competency[skill/@name="Maths"]/level';
foreach ($xpath->evaluate($expression) as $level) {
$level->textContent += 1;
}
echo $document->saveXML();
输出:
<?xml version="1.0"?>
<map>
<competency>
<level>6</level>
<skill name="Maths">
<skillinfo> "some value" </skillinfo>
</skill>
</competency>
</map>
您也可以使用Xpath获取输出的标量值。
foreach ($xpath->evaluate('/map/competency') as $competency) {
echo $xpath->evaluate('string(skill/@name)', $competency), ': ';
echo $xpath->evaluate('string(level)', $competency), "\n";
}
输出:
Maths: 5