【问题标题】:Getting parsing error when attempting to remove empty xml tags with lxml尝试使用 lxml 删除空 xml 标记时出现解析错误
【发布时间】:2021-07-15 03:13:32
【问题描述】:

我正在从 csv 源创建一个 xml 文件,并且在此过程中从用户那里得到了一些非常有用的输入。看来我的最后一个要求(我才刚刚意识到)是在调用 API 之前删除任何空的 xml 标签(即没有内容的标签)。

我正在尝试使用 etree remove 方法删除空标签,但我收到一个错误,即 etree.fromstring 只能解析字符串。这是我的示例数据和代码。

ACTION|INV_ACCT_CLASS|EXT_INV_ID|WAREHOUSE_ID|NAME|CNTRY_CD|PHONE|ADDR_STR1|ADDR_STR2|CITY|ST|ZIP|ADD_KEY_NUM
add|2|AAA_00005|1001213|Company 1|US|9995555555|1313 Mockingbird Lane||New York|NY|10001|44433322
add|2|BBB_00008|1004312|Company 2|US|43255511110|Some other address||Stamford|CT|44112|11122233
import lxml.etree
 from lxml.builder import E 
 import csv
 import string
 import date from datetime

with open("filename.csv") as csvfile:

                    
  results = E.paiInv(*(
              E.invrec(
               E.action(row['ACTION']),
                E.investor(
                E.inv_account_class(row['INV_ACCOUNT_CLASS']),
                E.ext_inv_id(row['EXT_INV_ID']),
                E.warehouse_id(row['WAREHOUSE_ID']),
                E.name(row['NAME']),
                E.cntry_cd(row['CNTRY_CD']),
                E.phone(row['PHONE']),
                E.addr_str1(row['ADDRESS_STR1']),
                E.addr_str2(row['ADDRESS_STR2']),
                E.city(row['CITY']),
                E.st(row['ST']),
                E.zip(row['ZIP']),
                E.add_key_num(row['ADD_KEY_NUM'])
                      )
                ) for row in csv.DictReader(csvfile, delimiter = '|'))
                          )

  req = '<request_id>Investor' + str(date.today()) + '</request_id>'
  doc = lxml.etree.ElementTree(results)
  ins = lxml.etree.fromstring(req)
  ins.tail = "\n"
  dest = doc.xpath('/paiInv')[0]
  dest.insert(0,ins)

这正是我所需要的,除了如果 csv 中的任何列为空,我将得到空的 xml 标签,正如预期的那样。由于我们需要删除任何空标签,因此我尝试了以下代码:

root = lxml.etree.fromstring(results)
  for element in root.xpath(".//*[not(node())]"):
    element.getparent().remove(element)

我收到一条错误消息,提示“只能解析字符串”。我试图理解为什么它会找到除字符串以外的任何内容,以及我应该如何调整代码以使其正确删除空标签。

谢谢!

【问题讨论】:

    标签: python csv parsing lxml


    【解决方案1】:

    这是处理它的一种方法:将末尾的 for 循环更改为:

    for element in root.xpath('//*'):
        if element.text is None:
            elememt.getparent().remove(element)
    

    输出现在应该已经删除了两个空的 &lt;addr_str2&gt; 节点。

    【讨论】:

    • 感谢@Jack Fleeting。我还可以通过简单地将输出首先转换为字符串来获得所需的结果:resultz = (lxml.etree.tostring(results)) 但是您的解决方案似乎更优雅,所以我改用它。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多