PHP:查找孩子并更新同一父母下的另一个孩子

时间:2018-06-03 04:52:08

标签: php xml

有人可以帮我解决这个问题吗?我正在尝试在下面的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 />";
}

2 个答案:

答案 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节点并更改其文本内容。

Xpath表达式:

  • 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>

DOM的输出值:

您也可以使用Xpath获取输出的标量值。

foreach ($xpath->evaluate('/map/competency') as $competency) {
  echo $xpath->evaluate('string(skill/@name)', $competency), ': ';
  echo $xpath->evaluate('string(level)', $competency), "\n";
}

输出:

Maths: 5