[英]Python: namespaces in xml ElementTree (or lxml)
我想檢索遺留的xml文件,進行操作並保存。
這是我的代碼:
from xml.etree import cElementTree as ET
NS = "{http://www.somedomain.com/XI/Traffic/10}"
def fix_xml(filename):
f = ET.parse(filename)
root = f.getroot()
eventlist = root.findall("%(ns)Event" % {'ns':NS })
xpath = "%(ns)sEventDetail/%(ns)sEventDescription" % {'ns':NS }
for event in eventlist:
desc = event.find(xpath)
desc.text = desc.text.upper() # do some editting to the text.
ET.ElementTree(root, nsmap=NS).write("out.xml", encoding="utf-8")
shorten_xml("test.xml")
我加載的文件包含:
xmlns="http://www.somedomain.com/XI/Traffic/10"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.somedomain.com/XI/Traffic/10 10.xds"
在根標簽處。
我有以下與命名空間相關的問題:
<?xml version="1.0" encoding="utf-8"?>
。 <ns0:eventDescription>
而我需要輸出作為原始<eventDescription>
,在<eventDescription>
沒有命名空間。 這些如何解決?
查看名稱空間的lxml教程部分 。 本文還介紹了ElementTree中的命名空間 。
問題1:忍受它,就像其他人一樣。 而不是"%(ns)Event" % {'ns':NS }
嘗試NS+"Event"
。
問題2:默認情況下,僅在需要時才寫入XML聲明。 您可以在write()
調用中使用xml_declaration=True
強制它(僅限lxml write()
。
問題3: nsmap
arg似乎只是lxml。 AFAICT需要MAPping,而不是字符串。 嘗試nsmap={None: NS}
。 effbot文章有一節描述了解決方法。
按順序回答您的問題:
你不能只是忽略命名空間,而不是.findall()
使用的路徑語法,而不是“真正的”xpath(由lxml支持):你仍然被迫使用前綴,仍然需要提供一些前綴到uri的映射。
使用xml_declaration=True
以及使用.write()
調用encoding='utf-8'
(在lxml中可用,但在stdlib xml.etree中僅用於python 2.7我相信)
我相信lxml會表現得像你想要的那樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.