调整Python函数来解析xml

时间:2017-11-10 10:32:59

标签: python xml

我需要在外部域中读取X​​ML文件。 我的代码:

tree = ET.ElementTree(file=urllib2.urlopen('http://192.168.2.57:8010/data/camera_state.xml'))
root = tree.getroot()
root.tag, root.attrib

for elem in tree.iter():
    print elem.tag, elem.att

我无法进入我需要的结构,我的功能结果如下:

CameraState {}
Cameras {}
Camera {'Id': '1'}
State {}
Camera {'Id': '2'}
State {}
Camera {'Id': '3'}
State {}
Camera {'Id': '4'}
State {}

我需要调整这个Python函数以获得如下结果:

<CameraState>
    <Cameras>
        <Camera Id="1">
            <State>NO_SIGNAL</State>
        </Camera>

        <Camera Id="2">
            <State>OK</State>
        </Camera>
    </Cameras>
</CameraState>

1 个答案:

答案 0 :(得分:0)

你有解析的结构。这只是你访问它的方式。

使用getchildren访问子节点。递归打印结构的一个例子:

import xml.etree.ElementTree as ET


def print_tree(node, prefix=''):
    print(prefix, node.tag, node.attrib, node.text.strip())
    for child in node:
        print_tree(child, prefix + ' ')


tree = ET.ElementTree(file=<your file>)
root = tree.getroot()

print_tree(root)

它给出了:

CameraState {}
 Cameras {}
  Camera {'Id': '1'}
   State {} NO_SIGNAL
  Camera {'Id': '2'}
   State {} OK

但是,我建议你看一下xmltodict

import xmltodict


with open(<your file>) as f:
    tree = xmltodict.parse(f.read())

print(tree)

它为您提供OrderedDict s:

OrderedDict([('CameraState', OrderedDict([('Cameras', OrderedDict([('Camera', [OrderedDict([('@Id', '1'), ('State', 'NO_SIGNAL')]), OrderedDict([('@Id', '2'), ('State', 'OK')])])]))]))])