我正在尝试使用php动态创建xml架构,但我遇到了命名空间问题。我想要做的是让函数返回xsd:elements并将它们添加到xsd:sequence节点。
我在函数的临时DOMDocument中创建了xsd:element节点,我需要指定xsd命名空间“xmlns:xsd =”http://www.w3.org/2001/XMLSchema“否则为'xsd: '比特被删除。然后我从temporaty文档中提取所需的节点,并使用importNode()复制到existign DOMDocument。问题是完整的xmlns字符串附加到从创建元素的函数返回的每个节点
初始DOMDocument
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="UserType">
<xsd:sequence>
// add elements here
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
Temp DOMDocument我用来收集字段
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element type="xsd:string" name="Field1"/>
<xsd:element type="xsd:string" name="Field2"/>
<xsd:element type="xsd:string" name="Field3"/>
</xsd:schema>
我得到了什么
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"/>
<xsd:complexType name="UserType"/>
<xsd:sequence/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="xsd:string" name="Field1"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="xsd:string" name="Field2"/>
<xsd:element xmlns:xsd="http://www.w3.org/2001/XMLSchema" type="xsd:string" name="Field3"/>
</xsd:sequence/>
</xsd:complexType/>
</xsd:schema/>
如何导入现有命名空间?
答案 0 :(得分:2)
我需要做的是确保使用以下方法在第一个DOMDocument中创建 _ ALL _ 元素:
createElementNS('http://www.w3.org/2001/XMLSchema','xsd:sequence')
而不是:
createElement('xsd:sequence')
我只是在第一个需要xmlns声明的元素上使用createElementNS。
答案 1 :(得分:1)
似乎有效吗? http://codepad.viper-7.com/SueilL
<?php header('content-type: text/plain;charset=utf-8');
$s1 = '<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="UserType">
<xsd:sequence>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
';
$s2 = '<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element type="xsd:string" name="Field1"/>
<xsd:element type="xsd:string" name="Field2"/>
<xsd:element type="xsd:string" name="Field3"/>
</xsd:schema>
';
$ns = 'http://www.w3.org/2001/XMLSchema';
$doc = new DOMDocument();
$doc->loadXML($s1);
$seqElem = $doc->getElementsByTagNameNS($ns, "sequence")->item(0);
$d = new DOMDocument();
$d->loadXML($s2);
foreach ($d->getElementsByTagNameNS($ns, "*") as $e) {
$seqElem->appendChild($doc->importNode($e));
}
echo $doc->saveXML();