我正在尝试在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>
答案 0 :(得分:0)
如果没有定义名称空间,则根据XML规范,文档格式不正确,因此不符合XML要求。通常,XML解析器旨在解析并仅生成XML。
可能的方法可能是,如果你真的需要生成包含未定义的名称空间前缀的XML,那就是让simpleXML使用名称空间声明添加新元素,然后使用其他东西进行后处理(不是XML解析器;可能是简单的字符串操作或正则表达式)。
或者,如果您可以控制XPath,则可以通过使用local-name()
而不是元素qualified-name匹配元素来使其适用于任何命名空间,而不是/nodename
您可以做/*[local-name()='nodename']
。