【问题标题】:Prepending raw XML using PHP's SimpleXML使用 PHP 的 SimpleXML 前置原始 XML
【发布时间】:2015-03-03 00:37:30
【问题描述】:

给定一个基本 $xml 和一个包含 <something> 标记的文件,该标记具有属性、子项及其子项的子项,我想将其作为第一个子项附加,并将其所有子项附加为原始 XML。

原始 XML:

<root>
    <people>
        <person>
            <name>John Doe</name>
            <age>47</age>
        </person>
        <person>
            <name>James Johnson</name>
            <age>13</age>
        </person>
    </people>
</root>

文件中的 XML:

<something someval="x" otherthing="y">
    <child attr="val"  ..> { some children and values ... }</child>
    <child attr="val2" ..> { some children and values ... }</child>
            ...
</something>

结果 XML:

<root>
    <something someval="x" otherthing="y">
        <child attr="val"  ..> { some children and values ... }</child>
        <child attr="val2" ..> { some children and values ... }</child>
            ...
    </something>
    <people>
        <person>
            <name>John Doe</name>
            <age>47</age>
        </person>
        <person>
            <name>James Johnson</name>
            <age>13</age>
        </person>
    </people>
</root>

该标记将包含多个直接和递归的子标记,因此通过 SimpleXML 操作构建 XML 是不切实际的。此外,将其保存在文件中会降低维护成本。

从技术上讲,它只是预先添加 一个 孩子。问题是这个孩子会有其他孩子等等。

PHP addChild page 上有一条评论说:

$x = new SimpleXMLElement('<root name="toplevel"></root>');
$f1 = new SimpleXMLElement('<child pos="1">alpha</child>');

$x->{$f1->getName()} = $f1; // adds $f1 to $x

但是,这似乎不会将我的 XML 视为原始 XML,因此会导致出现 &amp;lt;&amp;gt; 转义标签。似乎也出现了几个关于命名空间的警告。

我想我可以快速替换这些标签,但我不确定它是否会导致将来出现问题,而且感觉肯定不对。

手动破解 XML 不是一种选择,也不是一个接一个地添加子级。可以选择不同的库。

关于如何使它工作的任何线索?

谢谢!

【问题讨论】:

  • 我的主要问题实际上是添加原始 XML,而不是添加代码的顺序,尽管非常希望标签位于顶部。引用的问题不涉及此类问题。我刚刚编辑了我的问题标题以反映这种差异。
  • 我刚刚编辑了我的问题以反映真正的问题。

标签: php xml simplexml


【解决方案1】:

真的不确定这是否可行。试试这个或否决这个,但我希望它有帮助。使用DOMDocument (Reference)

<?php
$xml = new DOMDocument();
$xml->loadHTML($yourOriginalXML);
$newNode = DOMDocument::createElement($someXMLtoPrepend);
$nodeRoot = $xml->getElementsByTagName('root')->item(0);
$nodeOriginal = $xml->getElementsByTagName('people')->item(0);
$nodeRoot->insertBefore($newNode,$nodeOriginal);

$finalXmlAsString = $xml->saveXML();
?>

有时 UTF-8 会产生问题,那么试试这个:

<?php
$xml = new DOMDocument();
$xml->loadHTML(mb_convert_encoding($yourOriginalXML, 'HTML-ENTITIES', 'UTF-8'));
$newNode = DOMDocument::createElement(mb_convert_encoding($someXMLtoPrepend, 'HTML-ENTITIES', 'UTF-8'));
$nodeRoot = $xml->getElementsByTagName('root')->item(0);
$nodeOriginal = $xml->getElementsByTagName('people')->item(0);
$nodeRoot->insertBefore($newNode,$nodeOriginal);

$finalXmlAsString = $xml->saveXML();
?>

【讨论】:

  • 我将您的第三行编辑为:$newNode = $xml-&gt;createElement($someXMLtoPrepend);,但我收到了PHP Fatal error: Uncaught exception 'DOMException' with message 'Invalid Character Error' 和几个与命名空间相关的警告。 XML 有效,不是手动生成的。
  • 你确定不是这样:stackoverflow.com/questions/8524111/php-invalid-character-error 吗?我的意思是 - 你的节点名称都不是以数字或其他东西开头的吗?
  • 我没有任何名称以数字开头的标签。反正我会调查的。
  • @wtf8_decode 我添加了编辑来回答,也许就是这个,但我真的不确定。我只将DOMDocument 与 HTML 一起使用,从不与 XML 一起使用,应该没有太大区别..
  • 还是一样。我的 XML 不是手动生成的,甚至包含&lt;![CDATA[ 标签。我看到 DOMDocument 对此感到有些困惑,因为它仍在尝试解析内部 XML。有问题的行似乎是mb_convert_encoding 之一。
猜你喜欢
  • 2015-09-23
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2013-12-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多