4

PythonでXMLを解析しています。XML を検証するための XSD スキーマがあります。XSD で定義されているように、XML の特定のノードの型を取得できますか?

たとえば、私の XML (小さな部分) は

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

私のXSDは(もう一度その一部です):

<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>

解析中に、タグwakeupNoteが XSD でcomplexType zwv:descriptionとして定義されていることを知りたいです。これを行う方法(Pythonで)?

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

したがって、言語の説明を持つ可能性のあるすべてのタグを取得し、タグが存在し、 en<lang>の内容が空でないことを確認するという考え方です。

UPD

検証中に XML が XSD に対してチェックされるため、検証エンジンはすべてのノードのタイプを認識します。7 か月前に同様の質問がありましたが、まだ回答がありません。それらは関連しています、私見。Python の XSD に基づく XML のデフォルト値の検証と入力

4

2 に答える 2

0

質問が次の場合:特定のXMLノードのタイプの名前を見つけるにはどうすればよいですか?答えは、Pythonでxpathを使用して検索することです。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を作成できます。

于 2011-02-03T03:54:56.803 に答える
0

バリデーターは、検証するすべての要素と属性の型の関連付けを認識している必要があり、バリデーターはその情報へのアクセスを提供できる立場にあるというのは正しいことです。

ただし、良くも悪くも、呼び出し元とバリデーターの間の API と、呼び出し元が利用できる検証関連情報の選択は、完全に実装定義です。一部のバリデーター (Xerces J は注目すべき例です) は、非常に完全な範囲の検証情報を利用可能にします。他の人はしません。

使用しているバリデーターを知らなければ、探している型情報が利用可能かどうかを確実に知ることはできません。バリデーターを呼び出しているため、API が必要です。API を介して型の関連付けが利用できる場合は、おそらくドキュメントにそのように記載されています。API がアクセスを提供しない場合は、基礎となるスキーマ バリデーターが情報へのアクセスを提供していないか、API の作成者が要点を理解していなかったことが原因である可能性があります。あなたの仕事は(これをさらに追求したい場合)、それらのどれが当てはまるかを見つけ出し、関係者に情報を利用可能にすることが役立つことを説得することです.

API を介して情報にアクセスできない場合は、David W による別の回答で言及されているアプローチのより洗練されたバージョンを利用できます。要素の管理型が厳密には、検証ルートからその要素へのパスの関数であるため、ドキュメント インスタンス内の任意の要素について、ドキュメントがインスタンスは特定のスキーマに対して検証されます。たとえば、あなたが言及した場合、与えられたものが祖先としてまたはをwakeupNote持っているかどうか、またはdeviceDescriptionotherElementwakeupNote両方を持っており、その知識に基づいて適切な管理型定義を推測します。

このように自分自身を助けるには、かなりの量の作業が必要になる可能性があります。この情報を計算し、さまざまな形でアクセスできるようにする汎用ツールがあれば助かりますが、そのようなツールがあるかどうかはわかりません。(そのようなツールを有料で作成できる人を知っています。) もし私があなたなら、まず API を通じて情報を取得しようとします。

于 2012-08-16T23:31:18.510 に答える