【问题标题】:Read XML block in Python在 Python 中读取 XML 块
【发布时间】:2020-10-18 12:48:47
【问题描述】:

我有一个如下所示的 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 标签内的值?

【问题讨论】:

  • 你标记了这个元素树;你试过用那个吗?发生了什么?给minimal reproducible example。此外,这似乎是多个 XML 文档挤在一起。
  • 到目前为止你尝试了什么?
  • 您的预期输出究竟是什么?
  • @JackFleeting 我期望每个 xml 的结果、数据包和调用值

标签: python python-3.x xml elementtree


【解决方案1】:

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

但是一旦全部修复,您就可以获得预期的输出。所以:

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

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2018-08-03
    • 1970-01-01
    相关资源
    最近更新 更多