3

Camstarというホスト型アプリケーションがあります。WCFを中心に構築されたSOAPWebサービスを提供します。

動作するペイロードがあります。以下のペイロードを使用して、SoapUIからWebサービスを呼び出すことができます。

   <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
   <soapenv:Header>
      <WSShopFloorHeader xmlns="http://www.camstar.com/WebService/WSShopFloor">
         <UserName>abc</UserName>
         <Password>def</Password>
      </WSShopFloorHeader>
   </soapenv:Header>
   <soapenv:Body>
      <Submit xmlns="http://www.camstar.com/WebService/WSShopFloor">
         <serviceData xmlns:ns0="http://www.camstar.com/WebService/DataTypes" ns0:type="LotStart">
            <Factory>
               <__CDOTypeName/>
               <__name>X30</__name>
            </Factory>
            <Comments/>
            <Workflow>
                  <__name>TESTSTOREWF</__name>
                  <__rev/>
                  <__useROR>true</__useROR>
            </Workflow>
            <WorkflowStep>
                <__CDOTypeName/>
               <__name>DBINTSINVSPEC</__name>
            </WorkflowStep>
            <Qty>1000</Qty>
            <Qty2>10</Qty2>
            <Product>
                <__CDOTypeName/>
               <__name>9672-02-9450-D00.BW</__name>
                <__rev/>
               <__useROR>true</__useROR>
            </Product>
            <StartReason>
                  <__CDOTypeName/>
                  <__name>NORMAL</__name>
               </StartReason>
               <Owner>
                  <__CDOTypeName/>
                  <__name>PROD</__name>
               </Owner>
               <Level>
                  <__CDOTypeName/>
                  <__name>LOT</__name>
               </Level>
               <ContainerName>TEST004</ContainerName>
             </serviceData>
      </Submit>
   </soapenv:Body>
    </soapenv:Envelope>

上記のXMLに基づいてXSDを作成する方法がわかりません。名前空間はSubmit要素とserviceData要素にのみあり、インラインです。

また、あるソースから別のソースに名前xmlを生成する必要がある場合、XSLTを作成するにはどうすればよいですか?

4

2 に答える 2

1

スキーマ定義で定義できる名前空間は1つだけです。したがって、必要な名前空間ごとに個別のスキーマ定義を作成する必要があります。

2つの名前空間があるので(.../WSShopFloorそして.../DataTypes-「...」は私の略語です)。2つのスキーマ定義が必要です。

簡単なものから始めましょう:.../DataTypes名前空間のスキーマ定義。「types.xsd」という名前のファイルに入れました。これはimport、後で使用するときに重要です。それが行う唯一のことはtype、そのターゲット名前空間で属性を定義することです。

$ cat types.xsd
<xsd:schema
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 targetNamespace="http://www.camstar.com/WebService/DataTypes"
>
  <xsd:attribute name="type"/>
</xsd:schema>

次に、名前空間のスキーマ定義について説明し.../WSShopFloorます。(名前空間の問題に対処するのに十分なだけ、すべてのコンテンツを実行するわけではありません。<Factory>文字列コンテンツが含まれているふりをして、その中のすべての要素をスキップします。)

<xsd:schema
 elementFormDefault="qualified"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
 xmlns:ns0="http://www.camstar.com/WebService/DataTypes"
 xmlns:tns="http://www.camstar.com/WebService/WSShopFloor"
 targetNamespace="http://www.camstar.com/WebService/WSShopFloor"
>
  <xsd:import
    namespace ="http://www.camstar.com/WebService/DataTypes"
    schemaLocation = "types.xsd"/>

  <xsd:import
    namespace = "http://schemas.xmlsoap.org/soap/envelope/"
    schemaLocation = "http://schemas.xmlsoap.org/soap/envelope/"/>

  <xsd:element name="WSShopFloorHeader">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="UserName" type="xsd:string"/>
        <xsd:element name="Password" type="xsd:string"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="Submit">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="serviceData">
          <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Factory" type="xsd:string"/>   <!-- skip -->
            </xsd:sequence>
            <xsd:attribute ref="ns0:type"/>
          </xsd:complexType>
        </xsd:element>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>

まず、types.xsdスキーマ定義のインポートを参照してください。これは(上部にある)ns0同じ.../DataTypes名前空間を参照しています。<serviceData>さらに、その名前空間内のその定義を参照する属性を含む要素定義を見下ろします。

次に、soapエンベロープスキーマ定義もインポートする必要がありました。ところで:スキーマは実際には名前空間URIにあり、パーサーはそれをダウンロードします。ダウンロードして、指定したファイル名を参照することもできます(実際、これは私が行ったことです。毎回ダウンロードしなくても高速に実行されます)。

あなたの興味のために、.../soap/envelopeスキーマを見てください-それはトップレベルの要素を定義します<Envelope>、そしてそれをインポートするので、私たちのドキュメントはそれをトップレベルの要素としても持つことができます。<Envelope>定義<Header><Body>要素。別の名前空間( )<Header>にある場合は、任意のコンテンツを含めることができます。##other

<xs:any namespace="##other" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>

<Body>任意のコンテンツを含めることができます(##any-つまり、これで定義されたものを含む.../soap/envelope、、スキーマ

<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>

つまり、スキーマを取得できる場合にのみコンテンツを検証します。processContents="lax"スキーマを取得できない場合でも、エラーは発生しません。したがって、私のスキーマが実際に使用されていることを確認するために、エラーが報告されているかどうかを確認するために、意図的に間違いを導入しました(たとえば、要素名に文字を挿入します)。


ところで:あなたのxmlにエラーがあるのだろうか-<serviceData>要素には名前空間ns0:typeからの属性があります。.../Datatypesしかし、その名前空間から使用されるのはそれだけです...要素が「タイプ」としてマークされている場合、そのすべてのコンテンツはその名前空間から取得され、xmlns属性を使用して実行されます...省略されましたか?[もちろん、私はここで推測しているだけです-多分それはそのまま正しいです]

私もこれを学んでいるので、上記に間違いや誤解があるかもしれません-誰かがエラーを見たら、私を訂正してください!

于 2012-11-29T11:11:06.580 に答える
0

私はこの質問に2つの部分で答えます:

1)Soap XMLのXSD: そうですね。私の個人的な経験を共有する..サードパーティからSOAPXMLを入手します!実際にはWSDLとして知られているSOAPXMLには多数の名前空間があり、リアルタイムビジネスでは、これらの名前空間が変更されます。

一方、XMLとして扱う場合:
ノードごとに異なる名前空間を持つXMLファイルに出くわしたとき!つまり、親に存在する名前空間は子ノードの名前空間と同じではありません。13renにリンクされた複数のXSDファイルを考え出す必要があります<import> すでに回答が投稿されています。しかし!! この種の検証は、ほとんどのXMLパーサーでは機能しません。私自身も経験しました!

XSDの複数の割り当てが機能するMS-visualスタジオで動作することを確認しました!...NetでXMLとXSDをロードしようとすると、XmlValidatingReaderこれは失敗します!! 他のオンライン検証ツールと同じ動作..

そして、このSOAPXMLにはもう1つの問題があります。それらはさまざまな名前空間を持っています。この方法では、名前空間の数と同じ数のXSDファイルを追加し続けることはできません。

また、SOAPXMLに対してXSDを使用しようとする.netコードも試しました。ここにリンクがあり ます..しかし、私は恐れています..私はうまく成功できませんでした!

XMLを手動で検証している場合は、13renの方法に賛成です。

2)XML用のXSLT: XSLTは関数型プログラミング言語です(手続き型ではありません)。XSLTの練習は次のようになります。

まず、XML全体をそのままコピーしてみます.. <copy> and <apply-templates select="@*|*|text()"/>ペアの重要性を学びます..アイデンティティテンプレートを理解します!! @による属性と*による要素、およびtext()としてのテキストデータの通知を理解する必要があります。

要素と属性を追加および削除してみてください..<template match="element_or_Attribute_name"/>要素/属性を削除するために使用して<value-of select=""/>ください..ここでも画像が表示されます..

属性を要素に変換してみてください。その逆も同様です。

要素のグループまたは親タグを他の何かの下に移動してみてください..使用してその重要性を理解して<for-each select=""/>ください(ここで必要になります..)..タグの名前を変更するコードを記述します..および属性..

異なる子タグ名と孫タグを使用して巨大なXMLを構築する多くのタグを追加および削除できるXSLを構築する..これまでに(一度に1つずつ)試したすべての可能性を使用する

参考のためのチュートリアル: https ://stackoverflow.com/questions/1858345/xsltwhich-is-the-best-tutorial-you-would-like-to-recommend

于 2012-11-29T12:45:37.813 に答える