使用DOm和PHP向现有XML文档添加节点


Add node to existing XML document using DOm and PHP

我希望有人能帮助我,因为我快疯了。

我需要使用PHP更新现有的XML文件。如果其中一个节点的值等于什么,那么我想添加一个新的子元素,其中包含一些文本。

下面是一个XML文件的例子:

<properties>
  <property>
    <address>
      <street>Example Road</street>
      <locality>Fitzrovia</locality>
      <town>London</town>
      <postcode>NW1</postcode>
    </address>
  </property>
  <property>
    <address>
      <street>Default Street</street>
      <locality>Sample</locality>
      <town>London</town>
      <postcode>EC1</postcode>
    </address>
  </property>
</properties>

我现在用的PHP:

$dom = new DOMDocument();
$dom->load('http://example.com/example.xml');
$xpath = new DOMXPath($dom);
$postcode = $xpath->query('property/address/postcode');
foreach($postcode as $region)
{
    $r = $region->nodeValue;
    if (preg_match('/^nw(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'North West London';
    }
    else if (preg_match('/^n(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'North London';
    }
    else if (preg_match('/^e(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'East London';
    }
    else if (preg_match('/^se(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'South East London';
    }
    else if (preg_match('/^sw(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'South West London';
    }
    else if (preg_match('/^w(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'West London';
    }
    else if (preg_match('/^ec(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'East Central London';
    }
    else if (preg_match('/^wc(?=[0-9]*)/i', $r)) {
        $region->nodeValue = 'West Central London';
    }
    else {
        $region->nodeValue = 'Outer London';
    }
}
$dom->save('export.xml');

我想做的是,如果邮政编码等于一个特定的值,那么一个新的子节点将被添加到带有一些文本的'address'节点。

我遇到了一些问题,我可以得到一个新的子节点来生成,但是它会添加很多子节点,并且只在XML文件的一部分中添加,而不是在每个"属性"节点中添加一个实例。

我希望这是有意义的,因为我真的需要一些帮助。

提前感谢:)

您应该使用DOMDocument::createElement来创建新节点,使用DOMNode::appendChild来追加新节点。

的例子:

if (preg_match('/^nw(?=[0-9]*)/i', $r)) {
    $element = $dom->createElement('your_node_name', 'North West London');
    $region->parentNode->appendChild($element);
}