【问题标题】:Is this the best approach to parsing with LXML?这是用 LXML 解析的最佳方法吗?
【发布时间】:2018-02-03 17:10:56
【问题描述】:

我是 LXML 的新手,通常解析 XML 文档。我已经编写了一小段代码,似乎也可以完成我需要它做的事情,但感觉好像我把它过于复杂了。有什么办法可以简化吗?

方法:

def importFromXML(self, filename):
    tree = etree.parse(filename)
    for child in tree.getroot():
        if child.tag != 'SLOT':
            print('Tag:', child.tag, ', Text', child.text)
        elif child.tag == 'SLOT':
            for slot, index in child.items():
                for attribute in child:
                    print('Slot Number =', index, ', Tag:', attribute.tag, ', Value:', attribute.text)

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Item>
<ActiveState>drop</ActiveState>
<Location>Left Wrist</Location>
<Realm>All</Realm>
<ItemName>Band of the Dream Conqueror</ItemName>
<ItemQuality>100</ItemQuality>
<Equipped>1</Equipped>
<Level>50</Level>
<TYPE>Wrist</TYPE>
<SOURCE>Drop</SOURCE>
<DBSOURCE>kscraft</DBSOURCE>
<SLOT Number="0">
    <Type>Resist</Type>
    <Effect>Crush</Effect>
    <Amount>6</Amount>
</SLOT>
<SLOT Number="1">
    <Type>Resist</Type>
    <Effect>Thrust</Effect>
    <Amount>6</Amount>
</SLOT>
<SLOT Number="2">
    <Type>Resist</Type>
    <Effect>Slash</Effect>
        <Amount>6</Amount>
</SLOT>
</Item>

我只是想确保我做对了。我正在使用 Python 3.x

【问题讨论】:

  • 所以你的目标是打印它吗?对于这种特殊情况,我认为不会有更好的方法。
  • 现在我只是打印以确保在继续处理数据之前可以提取我需要的数据字段。
  • XPath 是一个很好的选择
  • 这取决于你想做什么。据我所知,没有更好的方法可以做到这一点,除了递归,或者将某些部分放在其他函数中。
  • 我只是想确保我这样做是正确的 ...如果代码呈现您想要的输出,那就是正确的。现在,效率、优化、最佳实践是一个不同的问题,应该在CodeReview 上提问,因为 SO 是针对出错或产生不希望的结果的代码。

标签: python xml python-3.x parsing lxml


【解决方案1】:

我认为你的解析没有什么可批评的。特别是,它非常易读,并且易于理解。不过,我建议对if 语句进行微调。

  • 以这种方式编写它可以避免使用not,而not 又为理解代码和理解自然语言增加了一个障碍。
  • 我已将 elif 舍弃为普通的 else

if child.tag == 'SLOT':
    for slot, index in child.items():
        for attribute in child:
            print('Slot Number =', index, ', Tag:', attribute.tag, ', Value:', attribute.text)
else:
    print('Tag:', child.tag, ', Text', child.text)

【讨论】:

    猜你喜欢
    • 2020-06-28
    • 2013-12-20
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多