从xml节点中提取值

时间:2015-12-30 05:53:36

标签: python xml python-2.7 xml-parsing

我知道从以下格式的xml中获取值:

<note>
    <col1>Tove</col1>
    <col2>J</col2>
    <test2>
        <a> a </a>
        <b> b </b>
        <c> c </c>
        <d> d </d>
    </test2>
    <code
        a="1"
        b="2"
        c="3"
    />
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

我提取的值如下:

for a in xmls.getiterator():
    b = a.find("col1") # or col2
    if b is not None:
        print b.text  #this helps in extracting the value
        break

我的问题我需要在test2code节点中提取值,但使用上述方法,我的输出为None

预期输出

理想情况如下所示,但获得a,b,c,d,1,2,3等直接节点值最佳

            <a> a </a>
            <b> b </b>
            <c> c </c>
            <d> d </d>

           and

            a="1"
            b="2"
            c="3"

如果我们有目标节点名称,那么从xml中提取不同类型值的本机方法是什么?

相关:

1 个答案:

答案 0 :(得分:1)

我会使用lxml.etree.xpath().attrib来获取属性值:

import lxml.etree as ET

data = """<note>
    <col1>Tove</col1>
    <col2>J</col2>
    <test2>
        <a> a </a>
        <b> b </b>
        <c> c </c>
        <d> d </d>
    </test2>
    <code
        a="1"
        b="2"
        c="3"
    />
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>
"""

tree = ET.fromstring(data)

for note in tree.xpath("//note"):
    test2_values = [value.strip() for value in note.xpath(".//test2/*/text()")]
    code_attrs = note.find("code").attrib

    print(test2_values)
    print(code_attrs)

这里,我们基本上迭代所有note个节点(假设有多个节点),获取内部test2节点下所有节点的文本以及code节点的所有属性具有

打印:

['a', 'b', 'c', 'd']
{'b': '2', 'c': '3', 'a': '1'}