2011-01-25 10 views
4

私はPythonでXMLを解析しています。 XMLを検証するためのXSDスキーマがあります。 XSDで定義されているXMLの特定のノードのタイプを取得できますか?XSDで定義されているXMLノードのタイプを取得することは可能ですか?

例えば、私のXML(小部分)が(再び、それのほんの一部)私のXSDがある

<deviceDescription> 
    <wakeupNote> 
    <lang xml:lang="ru">Русский</lang> 
    <lang xml:lang="en">English</lang> 
    </wakeupNote> 
</deviceDescription> 

です:

<xsd:element name="deviceDescription" type="zwv:deviceDescription" minOccurs="0"/> 

<xsd:complexType name="deviceDescription"> 
    <xsd:sequence> 
    <xsd:element name="wakeupNote" type="zwv:description" minOccurs="0"> 
     <xsd:unique name="langDescrUnique"> 
     <xsd:selector xpath="zwv:lang"/> 
     <xsd:field xpath="@xml:lang"/> 
     </xsd:unique> 
    </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

<xsd:complexType name="description"> 
    <xsd:sequence> 
    <xsd:element name="lang" maxOccurs="unbounded"> 
     <xsd:complexType> 
     <xsd:simpleContent> 
      <xsd:extension base="xsd:string"> 
      <xsd:attribute ref="xml:lang" use="required"/> 
      </xsd:extension> 
     </xsd:simpleContent> 
     </xsd:complexType> 
    </xsd:element> 
    </xsd:sequence> 
</xsd:complexType> 

解析中に私がいることを知りたい私タグウェイクアップノートはXSDでcomplexType zwv:descriptionと定義されています。どのようにこれを行う(Pythonで)?

これは何のために必要なのですか?私がこれらのXMLをたくさん持っていて、それらのすべてに英語のフィールドがあることを確認したいと考えています。 <lang xml:lang="en"></lang>が空であることを確認するのは簡単ですが、このタグをまったく指定しないことができます。

考えられるのは、言語の説明を持つ可能性があるすべてのタグを取得し、の空でないコンテンツがあることを確認することです。検証中に私のXMLは、XSDに照らしてチェックされているので

UPD

は、検証エンジンは、すべてのノードの種類を知っています。私は7ヶ月前に同様の質問をしましたが、まだ答えはありません。彼らは関連している、イホ。 Validating and filling default values in XML based on XSD in Python

答えて

0

質問がある場合:特定のXMLノードのタイプの名前はどのようにして見つけられますか? 答えは、xpath in pythonを使用して検索することです。 xsd上で実行するxpathは

//element[@name='wakeupNote']/@type 

です。これはzwv:descriptionを返します。 2つのタイプを返す場合は、ルートから歩かなければならないでしょう。

/root/foo/wakeupNote (type A) 
/root/bar/wakeupNote (type B) 

これは根元から歩き回りが面倒です。あなたは、無名型と名前付き型の両方を探す必要があります。

質問がある場合:特定のタイプのすべてのXMLノードを見つけるにはどうすればよいですか? スキーマが頻繁に変更される場合は、上記の方法で解析する際に、すべてのノードの種類をテストできます。

スキーマがよく知られていて固定であり、XPATHで探しているノードが見つかる場合は、各ノードをテストできます。

//@xml:lang='en' 

次に、それぞれの長さを調べるためにpythonを使用します。

安定スキーマの場合、探している基準を適用する2番目のXSDを書くことができます。

+0

XSDで定義されているすべてのXMLノードを 'zwv:description'として見つけたいと思います。例えば、私のXSDでは 'wakeupNote'を' zwv:description'の 'inside deviceDescription'と' zwv:shortdescription'という別のタグの中に定義して定義することができます。私のXMLには2種類の 'wakeupNote'があります。そして、 'zwv:description'型のものだけを選択する必要があります。どうやってするの? – PoltoS

+0

編集があなたの必要を満たさない場合は、コメントを追加してください。質問と回答を明確にする機会を与えずに投票をしないでください。 –

+0

これについてもっと考えると、良い推薦をするためにユースケースを理解する必要が増えます。どのようにXMLを解析していますか?スキーマはどのくらいの頻度で変更されますか? XSDはあなたのものか他の人ですか?それが相手方であれば、なぜあなたは追加の検証を課したいのですか? –

0

バリデータは、検証するすべての要素と属性の型の関連付けを知っていて、バリデータはその情報へのアクセスを提供する位置にあることが必要です。

ただし、呼び出し元と検証者間のAPIと呼び出し元が使用できる検証関連情報の選択は、完全に実装定義されています。いくつかのバリデーター(Xerces Jは注目すべき例です)は非常に豊富なバリデーション情報を提供しています。他の人はそうしない。

あなたが使用しているバリデーターを知らないと、誰もあなたが探しているタイプ情報が利用可能かどうかを確実に伝えることができません。バリデータを呼び出しているので、APIが必要です。型の関連付けがAPIを介して利用可能な場合、おそらくドキュメンテーションはそのように言います。 APIがアクセスを提供しない場合は、基礎となるスキーマバリデータが情報へのアクセスを提供しないか、APIの作成者がその点を認識しなかった可能性があります。あなたの仕事(これをさらに追求したいと思っている場合)は、それらのどれが該当するのかを見極め、情報を利用できるようにすることが有益であることを関連当事者に説得しようとします。

APIを使用して情報にアクセスすることができない場合は、David Wの別の回答に記載されているより洗練されたバージョンのアプローチをご利用ください.XSDスキーマのプロパティで、は、検証ルートからその要素へのパスの関数であるため、原則的に(実際に少し面倒であれば)、文書インスタンス内の任意の要素について、その統治型がどのようになるかを特定するのは簡単ですドキュメントインスタンスが特定のスキーマに対して検証されているかどうかたとえば、wakeupNotedeviceDescriptionまたはotherElementを祖先としているのか、wakeupNoteがその両方を持つ場合は、より祖先であるのかを知り、その知識に基づいて適切な統治タイプ定義を推論するのは簡単です。

このように自分自身を助けることは、ほんの些細な作業量を必要とする可能性があります。この情報を計算し、さまざまな形でアクセスできるようにする汎用ツールがあれば役に立ちますが、そのような情報がある場合はそのことについてはわかりません。 (私はそのようなツールを手数料で作ることができる人たちを知っています。だから、もし私があなただったら、まずAPIを通して情報を入手しようとします。

関連する問題