簡體   English   中英

Python:xml ElementTree(或lxml)中的命名空間

[英]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文件在開頭沒有<?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.

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