在xml文件中添加子节点

时间:2010-09-02 06:23:17

标签: php xml

我有一个xml文件

<?xml version="1.0" encoding="UTF-8"?>
<xml>
<settings>
<title>Calendar2</title>
<subTitle>Calendar2</subTitle>
</settings>
<events date="02-09-2010">
<event>
<title>HTML Tags</title>
<description>HTML Tags</description>
</event>
</events>
</xml>

我如何在事件标记内添加与日期相关的其他事件

<?xml version="1.0" encoding="UTF-8"?>
    <xml>
    <settings>
    <title>Calendar2</title>
    <subTitle>Calendar2</subTitle>
    </settings>
    <events date="02-09-2010">
    <event>
    <title>HTML Tags</title>
    <description>HTML Tags</description>
    </event>
    <event>
    <title>Another Title</title>
    <description>Another description</description>
    </event>
    </events>
    </xml>

我使用了这段代码

$xml_str = file_get_contents($xmlfile);
$xml = new SimpleXMLElement($xml_str);
$event = $xml->events->addChild('event');
$event->addChild('title', 'More Parser Stories');
$event->addChild('description', 'This is all about the people who make it work.');
file_put_contents($xmlfile, $xml->asXML());

但是它会添加到第一个节点。如何添加到日期02-09-2010的事件标签

2 个答案:

答案 0 :(得分:1)

您必须查询所需的<events>代码而不是第一个代码($xml->events只返回的内容),使用xpath查询xml文档是有帮助的这里:

PHP脚本:

<?php
$xml_str = file_get_contents('xmlfile');
$xml = new SimpleXMLElement($xml_str);
$wantedEventsTag = $xml->xpath('/xml/events[@date="02-09-2010"]');
$wantedEventsTag = $wantedEventsTag [0];//since above fun will return an array
$wantedEventsTag['attrname']='attrval';//Here's how to add an attribute
$event = $wantedEventsTag->addChild('event');
$event->addChild('title', 'More Parser Stories');
$event->addChild('description', 'This is all about the people who make it work.');
file_put_contents('xmlfile.xml', $xml->asXML());

包含多个<events>标记的示例XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<xml>
  <settings>
    <title>Calendar2</title>
    <subTitle>Calendar2</subTitle>
  </settings>
  <events date="01-01-1999">
  </events>
  <events>
  </events>
  <events date="02-09-2010">
    <event>
      <title>HTML Tags</title>
      <description>HTML Tags</description>
    </event>
    <event>
      <title>Another Title</title>
      <description>Another description</description>
    </event>
  </events>
</xml>

脚本xpath将匹配所需的节点,我们稍后使用该节点并将事件子节点添加到。

答案 1 :(得分:0)

您需要使用DOM,特别是DOMNode :: insertBefore:

http://us.php.net/manual/en/domnode.insertbefore.php