当 xmlns 不存在时,SimpleXMLElement 使用错误的 xsd 命名空间
SimpleXMLElement uses wrong xsd namespace when xmlns is absent
我正在尝试生成以下输出:
<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd"><foo:element/><bar:element>value</bar:element></foo:fooBar>
但是,我的代码将第二个元素(有值的元素)的 prefix/namespace 设置为 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)的第三个参数设置为 anything 可以解决问题。
<?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 的情况下让第二个元素使用正确的 prefix/namespace?
当您使用 addchild()
添加元素 bar:element
时,您需要将命名空间作为第三个参数传递 - 这必须与您已声明的命名空间的原始 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>
我正在尝试生成以下输出:
<?xml version="1.0"?>
<foo:fooBar xmlns:foo="foo.xsd" xmlns:bar="bar.xsd"><foo:element/><bar:element>value</bar:element></foo:fooBar>
但是,我的代码将第二个元素(有值的元素)的 prefix/namespace 设置为 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)的第三个参数设置为 anything 可以解决问题。
<?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 的情况下让第二个元素使用正确的 prefix/namespace?
当您使用 addchild()
添加元素 bar:element
时,您需要将命名空间作为第三个参数传递 - 这必须与您已声明的命名空间的原始 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>