0

lxmlを使用してパス内のxmlファイルを解析およびオブジェクト化しています。多くのモデルとxsdがあり、各オブジェクトモデルは特定の定義済みクラスにマップされます。たとえば、xmlがmodelタグで始まる場合、それはdataModelであり、ページタグを使用すると、viewModelになります。

私の質問は、xmlファイルがどのタグで始まるかを効率的に検出し、適切なxsdファイルで解析してからオブジェクト化する方法です。

files = glob(os.path.join('resources/xml', '*.xml'))
for f in files:
    xmlinput = open(f)
    xmlContent = xmlinput.read()

    if xsdPath:
        xsdFile = open(xsdPath)
        # xsdFile should retrieve according to xml content
        schema = etree.XMLSchema(file=xsdFile)

        xmlinput.seek(0)
        myxml = etree.parse(xmlinput)

        try:
            schema.assertValid(myxml)

        except etree.DocumentInvalid as x:
            print "In file %s error %s has occurred." % (xmlPath, x.message)
        finally:
            xsdFile.close()

    xmlinput.close()
4

1 に答える 1

1

私はあなたの問題に集中するために、自発的にファイルの読み取りと治療を脇に置きます:

>>> from lxml.etree import fromstring
>>> # We have XMLs with different root tag
>>> tree1 = fromstring("<model><foo/><bar/></model>")
>>> tree2 = fromstring("<page><baz/><blah/></page>")
>>>
>>> # We have different treatments
>>> def modelTreatement(etree):
...     return etree.xpath('//bar')
...
>>> def pageTreatment(etree):
...     return etree.xpath('//blah')
...
>>> # Here is a recipe to read the root tag
>>> tree1.getroottree().getroot().tag
'model'
>>> tree2.getroottree().getroot().tag
'page'
>>>
>>> # So, by building an appropriated dict :
>>> tag_to_treatment_map = {'model': modelTreatement, 'page': pageTreatment}
>>> # You can run the right method on the right tree
>>> for tree in [tree1, tree2]:
...     tag_to_treatment_map[tree.getroottree().getroot().tag](tree)
...
[<Element bar at 0x24979b0>]
[<Element blah at 0x2497a00>]

私が以前にこれを見たことがなかったとしても、これが誰かに役立つことを願っています。

于 2012-08-06T16:47:05.303 に答える