【问题标题】:PHP and DOMDocumentPHP 和 DOM 文档
【发布时间】:2011-12-22 13:11:42
【问题描述】:

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

我有一个 PHP 程序

  1. 在 XML 文件中加载
  2. 处理XML的每个节点(行);将其发送到另一个进程,然后该进程返回一个 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。

任何帮助将不胜感激。

另外,如果有人能提供一种可能更有效的方法,那就太好了:)

谢谢。

罗伯

【问题讨论】:

  • 决定要在 PHP 中处理 XML 的库。您同时使用 SimpleXML 和 PHPDOM,我认为它们不能很好地协同工作。
  • 你指的是我最初的 simplexml_load_file() 吗?如果是这样,不确定这会影响我的最终输出,因为那只是一个驱动程序文件。感谢您的评论。
  • 我更改了行 $subNode = $addressXML->asXML();使用具有相同结果的 saveXML() :(

标签: php xml domdocument


【解决方案1】:

要将 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 函数。

编辑: 或者在您的用例中(感谢 cmets),您可以直接使用 simplexml 对象并将 import 它添加到您的 dom 文档中:

// 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);

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

【讨论】:

  • 或深度导入节点并追加
  • 我认为他指的是importnode:php.net/manual/en/domdocument.importnode.php
  • 现在也将其添加到答案中,这真的很高兴。
  • 赞成证明 simplexml 和 PHP DOM 确实可以协同工作。
  • 我尝试了 Hakre 代码的两种变体,都非常成功!然后我再深入一点(更简单)。事实证明,我得到的 $resultXMLNode 格式已经正确 - 即我没有将其包装在另一个元素('MyResponse')中。
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多