2010-03-06 70 views
1

我在PHP中使用DOMdocument类,每当我想创建一个XML文档。使用DOMdocument在XML文件中追加元素?

但是我怎样才能打开一个XML文档并在XML文档中的现有元素之后添加元素?

它是一个非常庞大的XML文档,所以最好能考虑最有效的方法来做到这一点。

回答

3

如果您坚持使用DOMdocument,追加新节点就像获取对现有节点的引用,创建子节点,然后将新节点附加到这些子节点一样简单。我在下面使用了XPath,但任何返回DOMNode的方法都应该可以工作。要记住的重要部分是即使您已经获取了树的一部分,在内部它也是原始DOMDocument的一部分。

$xml = new DomDocument(); 
$xml->loadXml('<foo><baz><bar>Node Contents</bar></baz></foo>');  

//grab a node 
$xpath = new DOMXPath($xml);  
$results = $xpath->query('/foo/baz'); 
$baz_node_of_xml = $results->item(0); 

//create a new, free standing node 
$new_node = $xml->createElement('foobazbar'); 

//create a new, freestanding text node 
$text_node = $xml->createTextNode('The Quick Brown Fox'); 

//add our text node 
$new_node->appendChild($text_node); 

//append our new node to the node we pulled out 
$baz_node_of_xml->appendChild($new_node); 

//output original document. $baz_nod_of_xml is 
//still considered part of the original $xml DomDocument 
echo $xml->saveXML(); 
+0

这种方法是否将整个XML DOM树读入内存?导致该文件是非常巨大的... – ajsie 2010-03-06 17:38:14

+0

我不确定DOMDocument的内部如何工作。一方面,大多数基于树的解析器都会将整个文档读入内存。另一方面,当你尝试print_r或者var_dump一个DOMDocument对象时,你只能看到所有可用节点的一小部分。试一试,如果它表现良好,那么你很好,f不会查看XMLParser或XMLReader。 – 2010-03-07 04:15:25

2

如果我没有弄错,DOMDocument会尝试将所有的XML加载到内存中。如果它很大,它可能会导致效率下降,并导致您的PHP过程中断。我跑进这一次,不得不从DOM文档转换为XML解析器,这是回调为主,这样您可以读取XML行由行,你认为合适的标签响应:

http://www.php.net/manual/en/book.xml.php