如何在PHP中包含外部XML文件?

时间:2011-07-18 09:50:18

标签: php xml simplexml

我需要一种在PHP中包含外部XML文件的方法,该文件不使用simplexml标记。此外,我还需要它与其他导入的XML集成,因此将文件头删除为<?XML version...>

基本上有一个PHP类,其中包含基于用户输入动态创建XML元素的方法。例如,我可以创建一个名为“test”的节点,将“id = 1”设置为属性并向其添加子节点。我基本上需要的是一种从其他文件中提取更多XML内容并让我的PHP脚本识别它的方法,因此能够在这个导入的代码上调用方法。我尝试使用php的fopen()函数,但是,虽然它会将导入的XML打印到屏幕上,但是一旦导入的代码开始它就不会验证并发出错误信号。我不能使用simpleXML扩展有两个主要原因。首先,整个类是使用Pre-PHP5 XML处理编写的,我不能从头开始重写整个事情,因为它是团队项目的一部分,其次,这样的类特征方法无法通过simpleXML扩展进行复制。

这是我生成的XML:<?xml version="1.0"?> <ga><dsa>hea</dsa><sda>eh</sda></ga> <gg><ds>he</ds><sd>eh</sd></gg>它返回:非法内容,第3行第1列,高举“&lt;” “gg”标签的...(顺便说一下,是从外部文件导入的部分。)

这是用于打印导入的XML的代码片段:

$file = simplexml_load_file($url);
     foreach($file as $key => $value) {
         echo "<" . $key . ">" .  $value . "</" . $key . ">\n";
      }

如何做到这一点?

附加说明:是的,服务器支持PHP 5(5.2.6),但代码是在pre-php5中编写的。

1 个答案:

答案 0 :(得分:2)

根据您的评论判断我会说您收到错误,因为有效的XML文档需要根元素。您有两个XML:<ga><gg>,这意味着XML无效且无法解析。

您应该通过添加根元素来修复XML。然后解析错误就会消失。

另一种选择是将代码段加载为document fragment with DOM:

$brokenXML = <<< XML
<?xml version="1.0"?>
<ga><dsa>hea</dsa><sda>eh</sda></ga>
<gg><ds>he</ds><sd>eh</sd></gg>
XML;

$dom = new DOMDocument;
$fragment = $dom->createDocumentFragment();
$fragment->appendXML(trim(str_replace('<?xml version="1.0"?>', '', $brokenXML)));
echo $dom->saveXml($fragment);

输出:

<ga><dsa>hea</dsa><sda>eh</sda></ga>
<gg><ds>he</ds><sd>eh</sd></gg>

但请注意,这仍然不是一个完整的XML文档,因为它错过了一个根元素。

如果要将DOM树导入另一个,可以使用DOMDocument::importNode。要将其与上面的片段一起使用,您可以

$dom2 = new DOMDocument('1.0', 'utf-8');
$dom2->appendChild($dom2->createElement('foo'))
        ->appendChild($dom2->importNode($fragment, true));

echo $dom2->saveXml();

这会导致

<?xml version="1.0" encoding="utf-8"?>
<foo><ga><dsa>hea</dsa><sda>eh</sda></ga>
<gg><ds>he</ds><sd>eh</sd></gg></foo>

如果您要导入的现有文档,则只需执行

$dom2 = new DOMDocument;
$dom2->load('existingFile.xml');
$dom2->documentElement->appendChild($dom2->importNode($fragment, true));

这会将片段附加为根节点的最后一个子节点。如果您想将它放在DOM树的其他位置,则必须在各个节点上使用Xpath或getElementsByTagNamegetElementsByIdchildNodes属性遍历DOM树,然后追加而是改为那个节点。