如何设置XML文件的节点?

时间:2011-07-18 14:47:28

标签: php xml parsing dom

我已经创建了一个XML文档。

所以,现在,我想找到好的节点并设置这个节点的值,但在对这个主题进行任何研究后,我不知道该怎么做。

这是我的文件:

<?xml version="1.0" encoding="utf-8"?>
<scripts>
  <script nom="myTools.class.php">
    <titre>Useful php classes</titre>
    <date>18/07/2011</date>
    <options>
      <option name="topic">Tutorials</option>
      <option name="desc">Tutorial for you</option>
    </options>
  </script>
  <script nom="index.php">
    <titre>blabla</titre>
    <date>15/07/2011</date>
    <options>
     <option name="topic">The homepage</option>
    </options>
  </script>
</scripts

&GT;

所以,我想用这些值构建一个html表单,但此时此刻,我无法得到并设置我想要的内容:(

我想获得第一个“脚本”节点:

  <script nom="myTools.class.php"> //How to set the "nom" attribute ?
    <titre>Useful php classes</titre> //How to get this value and set it ?
    <date>18/07/2011</date>
    <options>
      <option name="topic">Tutorials</option>
      <option name="desc">Tutorial for you</option>
    </options>
  </script>

循环所有文档没有问题,但只有我自己的选择

有你的想法吗?

2 个答案:

答案 0 :(得分:0)

XPath是这样做的一种方式:

$dom = new DOMDocument();
$dom->loadXML(... your xml here ...);

$xp = new DOMXPath($dom);
$results = $xp->query('//script[@nom='myTools.class.php']/titre');

$old_title = $results[0]->nodeValue;
$results[0]->nodeValue = 'New title here';

答案 1 :(得分:0)

使用XPath 首先得到dom文件

$dom=new DOMDocument();
$dom->loadXML('file');  // file is the name of XML file if u have a string of XML called $string then use $dom->loadXML($string)
$xpath=new DOMXPath($dom);
$path='//scripts/script[1]';  // that would get the first node
$elem=$xpath->query($path);

现在$ elem[0]是您的第一个脚本节点

如果您想按属性获取元素,请使用$path='//scripts/script[@nom='attribute value']'; 现在使用此路径将返回一个节点集,其中脚本元素的nom属性为ur给定值 你可以在这里看到更多


回应bahamut100的评论 选项元素的xpath是//options/option

现在,如果您的意思是按属性值获取选项节点,那么执行此操作

$path='//options/option[@attrib_name=attrib_value]';
$elem=$xpath->query($path);

但如果你的意思是获取节点的属性,那么首先你必须到达那个节点。在你的情况下,你必须首先到达选项节点

$path='//options/option';
$option=$xpath->query($path);

现在$option是一个节点列表 因此,要获得第一个元素的属性,请使用

$attribute=$option[0]->attributes;

现在$ attribute是一个NamedNodeMap,所以要获取第一个属性的值

$value=$attribute->item(0);