如何从python中获取(解析)XML子代

2024-09-30 16:34:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python或编码还不熟悉,所以请耐心回答我的问题

这里是我繁忙的XML

    <?xml version="1.0" encoding="utf-8"?>
<Total>
    <ID>999</ID>
    <Response>
        <Detail>
        <Nix>
            <Check>pass</Check>
        </Nix>  
        <MaxSegment>
            <Status>V</Status>
            <Input>
                <Name>
                    <First>jack</First>
                    <Last>smiths</Last>
                </Name>
                <Address>
                <StreetAddress1>100 rodeo dr</StreetAddress1>
                <City>long beach</City>
                <State>ca</State>
                <ZipCode>90802</ZipCode>
                </Address>
                <DriverLicense>
                    <Number>123456789</Number>
                    <State>ca</State>
                </DriverLicense>
                <Contact>
                <Email>x@me.com</Email>
                <Phones>
                    <Home>0000000000</Home>
                    <Work>1111111111</Work>
                </Phones>
                </Contact>
            </Input>
            <Type>Regular</Type>
        </MaxSegment>
        </Detail>
    </Response>
</Total>

我要做的是将这些值提取到下面整洁的表格中:
enter image description here

这是我目前为止的代码。。但我想不出怎么让这个孩子

^{pr2}$

提前谢谢你!在


Tags: nameidinputaddressresponsecheckstatusnix
2条回答

您可以创建一个字典,将列名映射到提取相应值的xpath表达式,例如:

xpath = {
  "ID": "/Total/ID/text()",
  "Check": "/Total/Response/Detail/Nix/Check/text()", # or "//Check/text()"
}

要填充表格行:

^{pr2}$

上面假设您使用支持完整xpath语法的^{}ElementTree supports only a subset of XPath expressions但在您的情况下可能已经足够了(您可以删除“text()”表达式并在本例中使用el.text),例如:

xpath = {
  "ID": ".//ID",
  "Check": ".//Check",
}
row = {name: tree.findtext(path) for name, path in xpath.items()}

要打印带有相应标记名的所有文本:

import xml.etree.cElementTree as etree

for _, el in etree.iterparse("xxm.xml"):
    if el.text and not el: # leaf element with text
       print el.tag, el.text

如果列名与标记名不同(如您的情况),那么最后一个示例不足以构建表。在

这样可以遍历树并只打印文本节点:

def traverse(node):
    show = True
    for c in node.getchildren():
        show = False
        traverse(c)
    if show:
        print node.tag, node.text

例如,我得到以下结论:

^{pr2}$

您可以将(node.tag, node.text)元组存储在dict中,而不是打印出来

相关问题 更多 >