在Python中读取XML块

2024-06-16 08:31:57 发布

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

我有一个如下所示的XML文件,其中包含多个XML。我想获取<Sacd>内容

<?xml version="1.0" encoding="utf-8"?>
<Sacd>
    <Acdpktg> <Acdpktg/>
</Sacd>
<?xml version="1.0" encoding="utf-8"?>
<Sacd>
    <Acdpktg/>
</Sacd>
<?xml version="1.0" encoding="utf-8"?>
<Sacd>
    <AcdpktG>
        <Result Value="0"/>
        <Packet Value="Dnd"/>
        <Invoke Value="abc"/>
    </AcdpktG>
</Sacd>

如何提取Sacd标记中的值


Tags: 文件内容packetvalueversionxmlresultutf
1条回答
网友
1楼 · 发布于 2024-06-16 08:31:57

嗯,您的xml在几个方面存在问题。首先,它在中包含多个xml文件——这不是一个好主意;它们必须拆分为单独的xml文件。第二,第一个<Acdpktg> <Acdpktg/>标记对无效;它应该是<Acdpktg> </Acdpktg>

但一旦所有的问题都解决了,你就可以得到预期的结果。因此:

from lxml import etree
big = """[your xml above,fixed]"""

smalls = big.replace('<?xml','xxx<?xml').split('xxx')[1:] #split it into small xml files

for small in smalls:
    xml = bytes(bytearray(small, encoding='utf-8')) #either this, or remove the xml declarations from each small file
    doc = etree.XML(xml)
    for value in doc.xpath('.//AcdpktG//*/@Value'):     
            print(value)

输出:

0
Dnd
abc

或者,可以通过将内部for循环更改一位来获得更丰富的输出:

for value in doc.xpath('.//AcdpktG//*'):     
            print(value.tag, value.xpath('./@Value')[0])

输出:

Result 0
Packet Dnd
Invoke abc

相关问题 更多 >