1

私が行っているPythonを使用するプロジェクトに少し行き詰まっています-私は非常に新しいです。ElementTree を使用して、着信 XML ファイルから指定されたデータを取得するように言われました。単純に聞こえますが、私はプログラミングが得意ではありません。以下は、私が使用しようとしているコードと一緒に入ってくるファイルの (非常に!) 小さな例です。

これで次に進むためのヒントや場所があれば教えてください。他の人が行ったことを検索してフォローしようとしましたが、同じ結果が得られないようです。私の目的は、「アクティブ」、「ルーム」、および「方向」に含まれる情報を取得することですが、後でさらに多くの情報を取得する必要があります。

XPath を使用してみましたが、特に xml が使用する名前空間と、必要なすべての XPath が大きくなりすぎるという事実では、うまく機能しません。原則を理解できるように例を単純化しました。この後、「AssetEquipment」とそれらの複数のインスタンスからより多くの情報を取得するために拡張する必要があります。その場合、最終的な目標は、1 つの機器からのすべての情報を辞書に保存して、後で操作できるようにすることであり、新しい機器ごとに個別の辞書を作成します。

XML の例:

<AssetData>
<Equipment>
    <AssetEquipment ID="3" name="PC960">
        <Active>Yes</Active>
        <Location>
            <RoomLocation>
                <Room>23</Room>
                <Area>
                    <X-Area>-1</X-Area>
                    <Y-Area>2.4</Y-Area>
                </Area>
            </RoomLocation>
        </Location>
        <Direction>Positive</Direction>
        <AssetSupport>12</AssetSupport>
    </AssetEquipment>
</Equipment>

コード例:

tree = ET.parse('C:\Temp\Example.xml')
root = tree.getroot()

ns = "{http://namespace.co.uk}"

for equipment in root.findall(ns + "Equipment//"):
    tagname = re.sub(r'\{.*?\}','',equipment.tag)
    name = equipment.get('name')

    if tagname == 'AssetEquipment':
        print "\tName: " + repr(name)
        for attributes in root.findall(ns + "Equipment/" + ns + "AssetEquipment//"):
            attname = re.sub(r'\{.*?\}','',attributes.tag)
            if tagname == 'Room': #This does not work but I need it to be found while
                                  #in this instance of "AssetEquipment" so it does not
                                  #call information from another asset instead.
                room = equipment.text
                print "\t\tRoom:", repr(room)
4

1 に答える 1

2
import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
for elem in tree.getiterator():
    if elem.tag=='{http://www.namespace.co.uk}AssetEquipment':
        output={}
        for elem1 in list(elem):
            if elem1.tag=='{http://www.namespace.co.uk}Active':
                output['Active']=elem1.text
            if elem1.tag=='{http://www.namespace.co.uk}Direction':
                output['Direction']=elem1.text
            if elem1.tag=='{http://www.namespace.co.uk}Location':
                for elem2 in list(elem1):
                    if elem2.tag=='{http://www.namespace.co.uk}RoomLocation':
                        for elem3 in list(elem2):
                            if elem3.tag=='{http://www.namespace.co.uk}Room':
                                output['Room']=elem3.text
        print output
于 2012-11-24T18:01:45.697 に答える