【问题标题】:Namespace issue with SimpleXmlElementSimpleXmlElement 的命名空间问题
【发布时间】:2018-12-05 15:22:52
【问题描述】:

我对 SimpleXMLElement 有疑问。
我必须在这里创建一个 XML:

<p:father>
  <child></child>
</p:father>

如果我尝试使用 SimpleXMLElement 执行此操作,结果是:

<p:father>
  <p:child></p:child>
</p:father>

所以所有的孩子都有相同的命名空间。 PHP代码是:

$xml = new SimpleXMLElement('<p:father xmlns:p="http://example.com" />');
$xml->addChild('child');

谁能帮帮我?我必须这样做才能为电子发票创建 xml。

【问题讨论】:

  • “所以所有子节点都有相同的命名空间。” - 无法重现,您的代码在所有 PHP 版本中都会导致 &lt;child/&gt;,请参阅 3v4l.org/lpt4g(但是那里显示的警告已经表明您当前没有正确处理命名空间元素的创建。)
  • 我必须做一个具有这种格式的 XML。 3v4l.org/HEdB3
  • 嗨,我已经edited 你的问题包括minimal reproducible example - 一段代码,有人可以实际运行来重现你的问题。请在以后的问题中尝试这样做,因为您之前的示例不是有效的 XML,让人们猜测您实际上在做什么。

标签: php xml simplexml


【解决方案1】:

这里的问题似乎是您将命名空间元素与非命名空间元素混合:您为命名空间提供前缀p:,但不要为非前缀元素设置任何默认命名空间。 SimpleXML 似乎“有帮助”将您的子元素设置在 p: 命名空间中,而不是根本没有命名空间。

我能找到的最简洁的解决方案是为无前缀元素定义命名空间 URI,然后将其传递给 addChild 调用:

$xml = new SimpleXMLElement('<p:father xmlns:p="http://example.com/prefixed" xmlns="http://example.com/default" />');
$xml->addChild('child', null, 'http://example.com/default');
echo $xml->asXML();

结果:

<?xml version="1.0"?> <p:father xmlns:p="http://example.com/prefixed" xmlns="http://example.com/default"><child/></p:father>

【讨论】:

    猜你喜欢
    • 2012-12-24
    • 2012-10-03
    • 2011-10-19
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2017-01-07
    相关资源
    最近更新 更多