[英]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.