PHP和DOMDocument

时间:2011-11-05 06:45:12

标签: php xml domdocument

我对使用DOMDocument和创建XML有疑问。

我有一个PHP程序

  1. 加载XML文件
  2. 处理XML的每个节点(行);将其发送到另一个进程,然后返回一个XML元素
  3. 我得到节点的字符串表示形式,以便我可以创建(追加)到新的结果XML树以返回到客户端
  4. 我遇到的问题是,在我尝试将最终文档返回给客户端之前,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();             
    
    ?>
    

    BTW,我将XML返回给客户端,以便我可以通过jQuery生成HTML。

    任何帮助都将不胜感激。

    此外,如果任何人都可以提供一种更有效的方式来做到这一点,那也很棒:)

    感谢。

    罗布

1 个答案:

答案 0 :(得分:5)

要将XML(作为字符串)附加到另一个元素中,您可以创建一个document fragment,然后可以附加:

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

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

这会将原始XML转换为domdocument元素,它正在使用DOMDocumentFragment::appendXML函数。

编辑:或者在您的用例中(对于评论),您可以直接使用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);

不需要将响应转换为字符串,并使用它执行替换操作。