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


How to add a namespace and use it inside a XML document using SimpleXML (PHP)?

我试图在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>

由于没有定义命名空间,文档的格式不符合XML规范,因此不符合XML的条件。通常,XML解析器设计为只解析和生成XML。

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

或者,如果您可以控制XPath,您可以通过使用local-name()而不是元素限定名来匹配元素,从而使其与任何命名空间一起工作。例如,您可以使用/*[local-name()='nodename']而不是/nodename