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 に答える