当xmlns不存在时,SimpleXMLElement使用错误的xsd命名空间

问题描述 投票:1回答:1

我正在尝试生成以下输出:

<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd"><foo:element/><bar:element>value</bar:element></foo:fooBar>

但是,我的代码将第二个元素(有值的那个)的前缀/命名空间设置为foo,即使我使用了bar:element

<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd"><foo:element/><foo:element>value</foo:element></foo:fooBar>

这是我的代码:

$base = "<foo:fooBar xmlns:foo=\"foo.xsd\" xmlns:bar=\"bar.xsd\"/>";

$xml = new SimpleXMLElement($base);
$foo = $xml->addChild("foo:element");
$bar = $xml->addChild("bar:element", "value");

echo($xml->asXML());

我注意到将addChild(xmlns)的第三个参数设置为任何东西都可以解决问题。

<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd"><foo:element/><bar:element xmlns:bar="arbitrary string">value</bar:element></foo:fooBar>

如何在不使用xmlns的情况下让第二个元素使用正确的前缀/命名空间?

Something like JSFiddle with my code

php xml simplexml
1个回答
2
投票

当您使用bar:element添加元素addchild()时,您需要将命名空间作为第三个参数传递 - 这必须与您已声明的命名空间的原始URI相匹配。如果传递不同的URI,那么它将假定您要声明一个新的命名空间。所以使用"bar.xsd"作为第三个参数......

$base = "<foo:fooBar xmlns:foo=\"foo.xsd\" xmlns:bar=\"bar.xsd\"/>";

$xml = new SimpleXMLElement($base);
$foo = $xml->addChild("foo:element");
$bar = $xml->addChild("bar:element", "value", "bar.xsd");

echo($xml->asXML());

会给...

<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd">
    <foo:element/>
    <bar:element>value</bar:element>
</foo:fooBar>
© www.soinside.com 2019 - 2024. All rights reserved.