2

我正在尝试使用 php 动态创建 xml 模式,但我在使用命名空间时遇到了问题。我想要做的是有一个函数返回 xsd:elements 并将它们添加到 xsd:sequence 节点。

我在函数的临时 DOMDocument 中创建 xsd:element 节点,我需要指定 xsd 命名空间 "xmlns:xsd="http://www.w3.org/2001/XMLSchema" 否则 'xsd:' 位是删除。然后我从临时文档中提取所需的节点并使用 importNode() 复制到存在的 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>

我用来收集字段的临时 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/>

如何导入现有的命名空间?

4

2 回答 2

2

我需要做的是确保我在第一个 DOMDocument 中创建了_ ALL _元素:

createElementNS('http://www.w3.org/2001/XMLSchema','xsd:sequence')

而不是:

createElement('xsd:sequence')

我只是在需要 xmlns 声明的第一个元素上使用 createElementNS 。

于 2012-06-01T06:01:30.493 回答
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();
于 2012-06-01T04:32:20.623 回答