3

私はxml文字列を変換したいと思います(外部ツールを使用してバイト配列から構築された自分自身。

ドキュメントと入力文字列はすべて同じ xsd で作成され、文字列を読み取ってpub.string:stringToBytesから XmlNode を取得します。pub.xml:xmlStringToXMLNode

この部分はうまく機能します。

その後、ドキュメントを作成し、Doc と呼びます。私は電話しますpub.xml:xmlNodeToDocument。しかし、返されたドキュメントは正しいタイプではありません。つまり、すべてのデータは正しい名前で正しいのですが、一部のデータを別のドキュメントにマップしようとすると、うまくいきません。

私はそれが明確ではないことを知っています、申し訳ありません。したがって、詳細には、単純な xsd があります。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
  <xs:complexType name="EtdDaCisIUpdParty">
    <xs:sequence>
      <xs:element name="wUpdatetsMax">
        <xs:simpleType>
          <xs:restriction base="xs:string">
            <xs:maxLength value="15"/>
          </xs:restriction>
        </xs:simpleType>
      </xs:element>
      <xs:element name="wTpsnEtendu" type="WTpsnEtendu"/>
      <xs:element name="wTpsnExt" type="WTpsnExt" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WTpsnEtendu">
    <xs:sequence>
      <xs:element name="Id" type="xs:string"></xs:element>
      <xs:element name="Name" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="WTpsnExt">
    <xs:sequence>
      <xs:element name="key" type="xs:string"></xs:element>
      <xs:element name="value" type="xs:string"></xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:element name="EtdDaCisIUpdParty" type="EtdDaCisIUpdParty" />

</xs:schema>

そして、この xsd に準拠する対応する xml 文字列:

<?xml version="1.0" encoding="utf-8"?>
<mstns:EtdDaCisIUpdParty  xmlns:mstns="http://tempuri.org/XMLSchema.xsd" >
    <mstns:wUpdatetsMax>40</mstns:wUpdatetsMax> 
    <mstns:wTpsnEtendu>
        <mstns:Id>13</mstns:Id>
        <mstns:Name>Test</mstns:Name>
    </mstns:wTpsnEtendu>
    <mstns:wTpsnExt>
        <mstns:key>1</mstns:key>
        <mstns:value>one</mstns:value>
    </mstns:wTpsnExt>
    <mstns:wTpsnExt>
        <mstns:key>2</mstns:key>
        <mstns:value>something</mstns:value>
    </mstns:wTpsnExt>
    <mstns:wTpsnExt>
        <mstns:key>3</mstns:key>
        <mstns:value>nothing</mstns:value>
    </mstns:wTpsnExt>
</mstns:EtdDaCisIUpdParty>

同じ xsd で生成されたドキュメント: ここに画像の説明を入力

次に、xml 文字列をドキュメントに変換するフロー サービスがあります。

ここに画像の説明を入力

動作しているように見えますが、そうではありません。単純なマップを追加すると、処理されませんでした:

ここに画像の説明を入力

結果のパイプラインには、最後のマップの値が含まれることはありません。デバッグ モードを使用した後、結果のドキュメントpub.xml:xmlStringToXMLNodeが自分のドキュメントと同じタイプではないことを理解しました。

ここに画像の説明を入力

Idパイプライン アウトの文字列がありません。

私の理解と私の例の何が問題になっていますか?

4

1 に答える 1

3

あなたの質問への答えは、mstns:EtdDaCisIUpdParty2 番目と 3 番目のスクリーンショットの変数のデータ構造の微妙な違いにあります。

2 番目のスクリーンショットは、変数を宣言したときに使用したドキュメント参照に従ってデータ構造を示しています。これは、構造の設計時のビューです (データ構造がどのように見えるかを期待します)。

- mstns:EtdDaCisIUpdParty
  - mstns:wUpdatetsMax
  - mstns:wTpsnEtendu
  - ...

実行時の実際のデータ構造を示す 3 番目のスクリーンショットとは異なります。

- mstns:EtdDaCisIUpdParty
  - @version
  - @encoding
  - mstns:EtdDaCisIUpdParty
     - mstns:wUpdatetsMax
     - mstns:wTpsnEtendu
     - ...

@versionXML プロローグ属性と、XML ドキュメントのルート ノードを表す、@encoding呼び出された子ドキュメントを含む、ランタイム構造の余分なレベルに注目してください。mstns:EtdDaCisIUpdParty

パイプライン変数mstns:EtdDaCisUpdPartyをドキュメント参照として宣言しましたが、実行時にそれは問題ではなく、効果もありません。ドキュメント参照により、webMethods Designer は、期待どおりのデータ構造を GUI で表示することができます。これにより、設計時にデータ構造を操作しやすくなります。ただし、ドキュメント参照は実行時に適用されません。

実行時には、 のトップ レベルから にマッピングしたためdocumentmstns:EtdDaCisUpdPartyと同じ構造になりdocumentますが、設計時に使用したドキュメント参照とは異なります。そのため、マップ ステップが機能しません。変数は実行時に実際にはパイプラインに存在せず、mstns:EtdDaCisIUpdParty/mstns:wTpsnEtendu/mstns:Id代わりに構造内の 1 レベル下にあります: mstns:EtdDaCisIUpdParty/mstns:EtdDaCisIUpdParty/mstns:wTpsnEtendu/mstns:Id.

document/mstns:EtdDaCisIUpdParty-->mstns:EtdDaCisIUpdPartyではなく、document-- >という構造内の次のレベルからマッピングすることで、フロー サービスを修正できますmstns:EtdDaCisIUpdParty

は動的な構造であるためdocument(その構造は、解析する XML に依存するため、実行時にのみ認識されます)、への呼び出しのService Outパイプラインの下にmstns:EtdDaCisIUpdParty、子として呼び出される IData ドキュメントを手動で作成する必要があります。次に、代わりにそれからマップします。documentpub.xml:xmlNodeToDocument

  1. Service Outパイプライン (右側の Pipeline Out ではありません) をクリックしdocument
  2. 新しいドキュメント変数を挿入します
  3. それに名前を付けますmstns:EtdDaCisIUpdParty
  4. Service OutパイプラインからPipeline Outの変数mstns:EtdDaCisIUpdPartyにマップします。mstns:EtdDaCisIUpdParty

pub.xml:xmlNodeToDocumentまた、すべての XML ドキュメントが一貫して解析されるように、への呼び出しで次の入力パラメータを設定することをお勧めします。

  • に値を指定する場合に必要なため、に設定makeArraysします。falsedocumentTypeName
  • 使用されている名前空間プレフィックスに関係なく、すべての XML ドキュメントが一貫して解析されるように に設定nsDecls/mstnshttp://tempuri.org/XMLSchema.xsdます ( 以外のプレフィックスは、mstnsと呼ばれるフィールドとして表されます。パラメーターmstns:fieldnameで名前空間を宣言しない限り、これは発生しません)。nsDecls
  • documentTypeName変数の宣言に使用したドキュメント参照に設定してmstns:EtdDaCisIUpdParty、a を含む XML 要素maxOccurs > 1が一貫して処理されるようにします (問題の要素が XML で 1 回だけ発生した場合でも、常に配列として解析されます)。

また、サービスが予期しない/サポートされていない XML ドキュメントで呼び出されるpub.schema:validateのを防ぐために、おそらく呼び出して、XML が整形式であり、上記で提供した XSD に対して有効であることを確認する必要があります。

于 2015-07-25T08:34:43.920 に答える