簡體   English   中英

如何使用lxml檢查每個元素中的xmlns

[英]How to check xmlns in every element using lxml

我正在使用lxml檢查Product元素,因為它們在MapReduce作業中流式傳輸。 我試圖確保每個元素中僅存在正確的xmlns值。 例如,每個Product元素都應將xmlns設置為“ http://mynetwork.products.com/new ”:

<Product xmlns="http://mynetwork.products.com/new">

當我檢查每個Product元素(一次流式傳輸)時,我只想確保它看起來像上面的一樣。 我想檢查以下潛在錯誤:

  1. 不正確的xmlns URL:

<Product xmlns="http://mynetwork.products.com/old">

  1. 缺少網址

<Product xmlns="">

  1. 缺少xmlns鍵/值對

<Product>

  1. 產品元素中的額外歸因

<Product xmlns="http://mynetwork.products.com/new" something="else">

我嘗試為每個元素(這是一個字典)存儲Product.nsmap的值,然后讀取字典的值進行驗證,但是這無助於我發現以下任何一種情況。 一定有辦法。

您可以檢查每個Product元素的nsmapattrib屬性的組合。 nsmap應該僅包含一個鍵值對,即鍵None ,其值應為"http://mynetwork.products.com/new" ,並且attrib應該為空,因為您不允許該元素中的任何屬性。

簡短示例(pyhon 2.7):

>>> from lxml import etree
>>> raw = '''<root>
... <Product xmlns="http://mynetwork.products.com/new"/>
... <Product xmlns="http://mynetwork.products.com/new" something="else"/>
... <Product xmlns="http://mynetwork.products.com/old" />
... <Product xmlns=""/>
... <Product/>
... </root>'''
... 
>>> root = etree.fromstring(raw)
>>> for p in root.findall('*'):
...     isValid = len(p.nsmap) == 1 \
...         and p.nsmap[None] == 'http://mynetwork.products.com/new' \
...         and not p.attrib
...     print isValid
... 
True
False
False
False
False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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