亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在解析之前使用 lxml 注冊命名空間

在解析之前使用 lxml 注冊命名空間

大話西游666 2022-07-05 15:19:38
我正在使用 lxml 從具有名稱空間的外部服務中解析 XML,但沒有將它們注冊到xmlns. 我正在嘗試手動注冊它register_namespace,但這似乎不起作用。from lxml import etreexml = """    <Foo xsi:type="xsd:string">bar</Foo>"""etree.register_namespace('xsi', 'http://www.w3.org/2001/XMLSchema-instance')el = etree.fromstring(xml) # lxml.etree.XMLSyntaxError: Namespace prefix xsi for type on Foo is not defined我錯過了什么?奇怪的是,查看 lxml 源代碼以嘗試了解我可能做錯了什么,似乎xsi命名空間應該已經作為默認命名空間之一存在。
查看完整描述

2 回答

?
PIPIONE

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"/>


查看完整回答
反對 回復 2022-07-05
?
慕無忌1623718

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。


查看完整回答
反對 回復 2022-07-05
  • 2 回答
  • 0 關注
  • 287 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號