当Product元素在MapReduce作业中流动时,我使用lxml来检查它们。我试图确保每个元素中只有正确的xmlns值。例如,每个Product元素都应该有一个xmlns设置为"http://mynetwork.products.com/new":
<Product xmlns="http://mynetwork.products.com/new">
当我检查每个Product元素(一次流式传输一个)时,我只想确保它看起来像上面的一样。我想检查以下潜在错误:
- 错误的xmlns URL:
<Product xmlns="http://mynetwork.products.com/old">
- 缺少URL
<Product xmlns="">
- 缺少xmlns键/值对
<Product>
- 产品元素中的额外归因
<Product xmlns="http://mynetwork.products.com/new" something="else">
我尝试为每个元素(它是一个字典)存储Product.nsmap的值,然后读取字典的值进行验证,但这对我检测以下任何情况都没有帮助。一定有办法。
您可以检查每个Product
元素的nsmap
和attrib
属性的组合。nsmap
应该只包含一个键值对,即值为"http://mynetwork.products.com/new"
的键None
,而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