簡體   English   中英

嘗試使用 lxml 刪除空的 xml 標記時出現解析錯誤

[英]Getting parsing error when attempting to remove empty xml tags with lxml

我正在從 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)

我收到一條錯誤消息,提示“只能解析字符串”。 我試圖理解為什么它會找到字符串以外的任何東西,以及我應該如何調整代碼以使其正確刪除空標簽。

謝謝!

這是處理它的一種方法:將最后的for循環更改為:

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

output 現在應該已經刪除了兩個空的<addr_str2>節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM