8

lxml 2.xを使用して特定のxsdタイプの要素のリストを取得しようとしていますが、特定のタイプのxsdをトラバースする方法がわかりません。

スキーマの例:

<xsd:element name="ServerOwner" type="srvrs:string90" minOccurs="0">
<xsd:element name="HostName" type="srvrs:string35" minOccurs="0">

xmlデータの例:

<srvrs:ServerOwner>John Doe</srvrs:ServerOwner>
<srvrs:HostName>box01.example.com</srvrs:HostName>

理想的な関数は次のようになります。

    elements = getElems(xml_doc, 'string90')

    def getElems(xml_doc, xsd_type):
      ** xpath or something to find the elements and build a dict
      return elements
4

1 に答える 1

5

ここに見られるように、実際にlxmlがXMLスキーマに対して持っている唯一の特別なサポートは、あるドキュメントがあるスキーマに従って有効であるかどうかを通知することです。より洗練されたものは、自分でやらなければなりません。

これは比較的単純な2フェーズのプロセスであると思います。xsd:elementスキーマ内の、関心のあるタイプに一致するすべての要素を取得し、それらの名前を確認してください。

def getElems(schemaDoc, xmlDoc, typeName):
    names = schemaDoc.xpath("//xsd:element[@type = $n]/@name",
                            namespaces={"xsd": 
                                        "http://www.w3.org/2001/XMLSchema"},
                            n=typeName)

次に、ドキュメントから各名前のすべての要素をフェッチします。

    elements = []
    for name in names: 
        namedElements = xmlDoc.xpath("//*[local-name() = $name]", name=name)
        elements.extend(namedElements)

これで、スキーマのタイプと一致する名前の要素のリストができました。

    return elements

ドキュメントを検索するためのxpath式はすべての要素を調べる必要があることに注意してください。そのため、ドキュメントのサブセクションのみを調べるようにそれを厳しくすることができれば、より速くなります。

于 2010-03-30T04:01:15.177 に答える