【问题标题】:how to insert a child note right before the first element of an XML? [duplicate]如何在 XML 的第一个元素之前插入子注释? [复制]
【发布时间】:2013-07-11 13:14:09
【问题描述】:
<source>        
    <job>
    <title><![CDATA[newsTitle]]></title>
    <date><![CDATA[newsTo]]></date>
     .......

现在,我需要添加

<publisher>abc</publisher>
<publisherurl>http://google.com</publisherurl>    

就在&lt;source&gt; 标记之后。我尝试了下面的代码,但它是在源标记之后添加的!

$doc = new DOMDocument();
$doc->load('C:\test.xml', LIBXML_NOBLANKS);    
$xpath = new DOMXPath($doc);
$hrefs = $xpath->evaluate("/source");
$href = $hrefs->item(0);   
$link = $doc->createElement("publisher","abc");
$href->appendChild($link);
$link = $doc->createElement("publisherurl","www.google.com");
$href->appendChild($link);

print $doc->save('C:\test.xml');

如何在源之后添加这些节点?

【问题讨论】:

  • 这是 PHP 吗?如果是这样,这样标记它会有所帮助。
  • 为什么包含&lt;source&gt;节点的变量叫hrefCopy-pasted您的代码,但忘记重命名变量?
  • 替代解决方案:添加带有 id 或时间戳的节点,让它们添加到任何他们想要的地方,并在阅读时排序以获取最新添加。

标签: php xml xpath xml-parsing


【解决方案1】:
<?php
$rssDoc = new DOMDocument();
$rss_file = 'C:\test.xml';
$rssDoc->load($rss_file);
$items = $rssDoc->getElementsByTagName('source');

$firstItem = $items->item(0);

$newItem[] = $rssDoc->createElement('lastBuildDate', 'Fri, 10 Dec 2008 22:49:39 GMT');
$newItem[] = $rssDoc->createElement('publisherurl', 'http://www.xyz.com');
$newItem[] = $rssDoc->createElement('publisher', 'XYZ');
foreach ($newItem as $xmlItem){
 $firstItem->insertBefore($xmlItem,$firstItem->firstChild);
} 

echo $rssDoc->save('C:\test.xml');
?>

嘿,Manoj Kumar,这应该适合你。尝试这个。 :)

【讨论】:

    【解决方案2】:

    使用DOMNode::insertBefore

    参考php参考页中给出的例子

    【讨论】:

      【解决方案3】:

      终于找到了解决办法。我仍然没有什么疑问,

      $rssDoc = new DOMDocument();
      $rss_file = 'C:\test.xml';
      $rssDoc->load($rss_file);
      $items = $rssDoc->getElementsByTagName('source');
      
      $newItem = $rssDoc->createElement('lastBuildDate', 'Fri, 10 Dec 2008 22:49:39 GMT');
      $rssDoc->appendChild($newItem);
      $firstItem = $items->item(0);
      $firstItem->insertBefore($newItem,$firstItem->firstChild);
      
      $newItem = $rssDoc->createElement('publisherurl', 'http://google.com');
      $rssDoc->appendChild($newItem);
      $firstItem = $items->item(0);
      $firstItem->insertBefore($newItem,$firstItem->firstChild);
      
      $newItem = $rssDoc->createElement('publisher', 'newschannel');
      $rssDoc->appendChild($newItem);
      $firstItem = $items->item(0);
      $firstItem->insertBefore($newItem,$firstItem->firstChild);
      
      echo $rssDoc->saveXML();
      

      是否可以在一个循环中一个接一个地附加这些孩子,然后类似地插入它?

      【讨论】:

        猜你喜欢
        • 2021-06-09
        • 1970-01-01
        • 2011-03-15
        • 2011-01-05
        • 2017-01-15
        • 2011-05-30
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多