XPath:如果子级存在-获取值,否则-写入空行

时间:2019-04-18 10:20:27

标签: xpath

我有三种节点类型:无类别,有一个类别和多个类别:

JObject json = JObject.Parse(firebaseResponse.Body);

我想从<technology> <categories> <category></category> </categories> <name></name> </technologie> <technology> <name></name> </technologie> <technology> <categories> <category></category> <category></category> <category></category> </categories> <name></name> </technologie> 节点写入数据,例如:

  • 如果只有一个类别-写出来,
  • 如果没有类别,请写空行
  • 如果有多个类别,请写下第一个类别。

我尝试了类似technology//technology/*[descendant::category]的操作-但是我无法获得空行,如果//technology/categories/category[1]不存在,则会写入所有现有类别一对一。

我如何以描述的方式写入数据?

1 个答案:

答案 0 :(得分:1)

我不知道这是您要遵循的方向,但是FWIW,您可以使用lxml处理它。如果您的代码是:

snip = """
<technology>
  <categories>
    <category>Cat-A</category>
  </categories>
  <name>Nam-1</name>
</technology>    

<technology>
  <name>Nam-2</name>
</technology>    

<technology>
  <categories>
    <category>Cat-B</category>
    <category>Cat-C</category>
    <category>Cat-D</category>
  </categories>
  <name></name>
</technology>
  """

您可以使用:

from lxml import etree
tree = lxml.etree.fromstring(snip, parser=lxml.etree.HTMLParser())

results  =  tree.xpath("*//technology")
for result in results:
    for j in result.getchildren():
        if j.tag == 'categories':
            for m in j.itertext():
                if m.strip() != '':
                    print(m)
                    break
            break
        else:
            print('none')
            break

输出:

Cat-A
none
Cat-B