2011-11-05 88 views
0

我有一个关于使用DOMDocument和创建XML的问题。PHP和DOMDocument

我有个PHP程序

  1. 负载在XML的XML文件
  2. 处理中的每个节点(行);将其发送到另一过程,然后返回一个XML元素
  3. 我得到的节点,这样我可以创建(附加)的字符串表示来一个新的,生成的XML树,以便返回到客户端

的问题是,XML看起来很好,直到我尝试将最终文档返回给客户端。我正在使用saveXML(),结果文件包含& lt & gt等。当我尝试保存文件[save()]时,我也会得到这些结果。一直在这个搜索PHP板上几个小时。

这里是我的代码:

<?php 

header('Content-type: text/xml'); 

// **** Load XML **** 
$xml = simplexml_load_file('Test1.xml');  

// Instantiate class; work with single instance 
$myAddress = new myAddressClass;   

$domDoc = new DOMDocument('1.0', 'UTF-8'); 
$domDoc->formatOutput = true; 
$rootElt = $domDoc->createElement('root'); 
$rootNode = $domDoc->appendChild($rootElt); 

//Go through each row of XML and process each address 
foreach($xml->Row as $row) 
{ 
    //fire off function against instance 

    // returns SimpleXMLElement 
    $resultXMLNode = $myAddress->buildRequest() ;  

    // need XML representation of node 
    $subNode = $addressXML->asXML();     

    // strip out extraneous XML def 
    $cleanSubNode = str_replace('<?xml version="1.0"?>', '', $subNode);  

    // create new node 
    $subElt = $domDoc->createElement('MyResponse', $cleanSubNode);    

    //append subElmt node 
    $rootNode->appendChild($subElt);           

} 
// need full XML doc properly formatted/valid 
$domDoc->saveXML();    

?> 

顺便说一句,我的XML返回给客户,这样我可以再通过jQuery生成HTML。

任何帮助,将不胜感激。

此外,如果任何人都可以提供多达这样做的潜在的更有效的方法,那简直太好了太:)

感谢。

罗布

+0

决定在PHP中处理XML所需的库。您正在同时使用SimpleXML和PHPDOM,我认为它们不能很好地协作。 – timdream

+0

你是指我最初的simplexml_load_file()?如果是这样,不知道这会影响我的最终输出,因为这只是一个驱动程序文件。谢谢你的评论。 – Rob

+0

我改变了行$ subNode = $ addressXML-> asXML();使用saveXML()与结果相同:( – Rob

回答

5

要追加XML(作为字符串)到另一个元素,为您打造一个document fragment您可以追加然后:

// create new node 
$subElt = $domDoc->createElement('MyResponse'); 

// create new fragment 
$fragment = $domDoc->createDocumentFragment(); 
$fragment->appendXML($cleanSubNode); 
$subElt->appendChild($fragment); 

这将原始的XML转换成DOM文档元素,它的制作使用DOMDocumentFragment::appendXML函数。

编辑:或者在您的使用情况(THX的意见),就可以直接使用了SimpleXML对象,并import到您的DOMDocument:

// create subelement 
$subElt = $domDoc->createElement('MyResponse'); 

// import simplexml document 
$subElt->appendChild($domDoc->importNode(dom_import_simplexml($resultXMLNode), true)); 

// We insert the new element as root (child of the document) 
$domDoc->appendChild($subElt); 

无需响应为转换字符串,然后用这个替换操作。

+1

或深入导入节点并追加它 – Gordon

+1

我认为他指的是importnode:http://php.net/manual/en/domdocument.importnode.php – CD001

+0

补充说:现在回答这个问题,这真的很好知道 – hakre