如何使用lxml检查每个元素中的xmlns

时间:2016-04-14 01:53:33

标签: python xml mapreduce lxml

我正在使用lxml检查Product Element在MapReduce作业中的流。我试图确保每个元素中只存在正确的xmlns值。例如,每个Product元素都应该将xmlns设置为" http://mynetwork.products.com/new":

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

当我检查每个Product元素(一次一个流)时,我只想确保它看起来像上面那样。我想检查以下潜在错误:

  1. xmlns网址不正确:
  2. <Product xmlns="http://mynetwork.products.com/old">

    1. 缺少网址
    2. <Product xmlns="">

      1. 缺少xmlns键/值对
      2. <Product>

        1. 产品元素中的额外归因
        2. <Product xmlns="http://mynetwork.products.com/new" something="else">

          我尝试为每个元素(这是一个字典)存储Product.nsmap的值,然后读取要验证的字典值,但它不能帮助我检测以下任何一种情况。必须有办法。

1 个答案:

答案 0 :(得分:2)

您可以检查每个nsmap元素的attribProduct属性的组合。 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