如何使用SimpleXML(PHP)添加命名空间并在XML文档中使用它?

时间:2015-07-01 12:13:21

标签: php xml namespaces simplexml

我正在尝试在XML中添加一个新节点,其名称空间未定义,我尝试使用SimpleXMLElement添加此命名空间并创建一个节点,如:

<namespace:nodename>

但是当我这样做时,SimpleXMLElement给出了这样的东西:

<nodename xmlns:namespace="namespace">

这是我写的代码:

$xml->addAttribute('xmlns:namespace', $url);
$xml->metadata->addChild('namespace:nodename', null, 'namespace');

这是我想要改变的XML:

<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns="http://www.imsproject.org/xsd/imscp_rootv1p1p2" identifier="EXAMPLE_1" version="1.1">
    <someothernode>
    </someothernode>
    <metadata>
    </metadata>
</manifest>

SimpleXML是添加名称空间的最佳方式吗?

我已经尝试过在Stack Overflow中找到的其他解决方案,但没有成功。我甚至包括一个双命名空间定义,如“xmlns:xmlns:namespace”,但它也不起作用。

主要问题是,当节点具有其他属性(使用xpath)时,读取我正在创建的节点的代码失败,它必须像以下一样干净:

<namespace:nodename>

1 个答案:

答案 0 :(得分:0)

如果没有定义名称空间,则根据XML规范,文档格式不正确,因此不符合XML要求。通常,XML解析器旨在解析并仅生成XML。

可能的方法可能是,如果你真的需要生成包含未定义的名称空间前缀的XML,那就是让simpleXML使用名称空间声明添加新元素,然后使用其他东西进行后处理(不是XML解析器;可能是简单的字符串操作或正则表达式)。

或者,如果您可以控制XPath,则可以通过使用local-name()而不是元素qualified-name匹配元素来使其适用于任何命名空间,而不是/nodename您可以做/*[local-name()='nodename']