2 回答

TA貢獻1829條經驗 獲得超9個贊
當 XML 文檔被解析然后再次保存時,lxml 不會更改任何前綴(并且register_namespace沒有效果)。
如果您的 XML 文檔未聲明其命名空間前綴,則它不是命名空間格式良好的。在解析之前使用register_namespace無法解決此問題。
register_namespace定義序列化新創建的 XML 文檔時要使用的前綴。
示例 1(不帶register_namespace):
from lxml import etree
el = etree.Element('{http://example.com}Foo')
print(etree.tostring(el).decode())
輸出:
<ns0:Foo xmlns:ns0="http://example.com"/>
示例 2(帶register_namespace):
from lxml import etree
etree.register_namespace("abc", "http://example.com")
el = etree.Element('{http://example.com}Foo')
print(etree.tostring(el).decode())
輸出:
<abc:Foo xmlns:abc="http://example.com"/>
示例 3(沒有register_namespace,但具有與常規前綴關聯的“知名”命名空間):
from lxml import etree
el = etree.Element('{http://www.w3.org/2001/XMLSchema-instance}Foo')
print(etree.tostring(el).decode())
輸出:
<xsi:Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

TA貢獻1744條經驗 獲得超4個贊
使用自定義命名空間的命名空間格式良好的XML還必須包含命名空間聲明本身。在第一個元素中添加一個xmlns就足夠了:
from lxml import etree
xml = """
<Foo xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:type='xsd:string'>bar</Foo>
"""
el = etree.fromstring(xml)
print (el)
因此,從技術上講,如果您的 XML 使用xsi但不包含命名空間聲明,則它不是(命名空間)格式良好的 XML。
添加回答
舉報