从python中的xml返回值

时间:2017-10-03 19:57:04

标签: python xml

使用python的import xml.etree.ElementTree as ET

从下面的xml返回已知的Min和Max值的好方法是什么?

我很难找到一种获得Max和Min值的简洁方法,所以我愿意接受任何建议。我无法控制XML的创建。

这是我的xml片段。

<options>
    <option>
        <name v="clamp"/>
        <value v="0"/>
    </option>
    <option>
        <name v="default"/>
        <value v="10"/>
    </option>
    <option>
        <name v="max"/>
        <value v="10"/>
    </option>
    <option>
        <name v="min"/>
        <value v="0"/>
    </option>
    <option>
        <name v="step"/>
        <value v="1"/>
    </option>
</options>

2 个答案:

答案 0 :(得分:2)

基本上,您想要检查元素name的属性是否等于minmax。如果是这样,您可以通过访问属性从value元素获取值,并从密钥v获取值。

以下是使用min库从给定字符串(名为max)中查找textlxml值的代码段。

from lxml import etree

tree = etree.fromstring(text) # or etree.parse if you want to parse XML file instead

for e in tree.xpath('//option'):
    if e.find('name').attrib.get('v') == 'min':
        min_val = e.find('value').attrib.get('v')
    if e.find('name').attrib.get('v') == 'max':
        max_val = e.find('value').attrib.get('v')

print(min_val, max_val) # ('0', '10')

注意如果属性不存在,您可能必须编写if / else语句。在这种情况下,它可以返回None,这会产生错误。

答案 1 :(得分:0)

作为一个选项,如果您的xml已被读为字符串,则可以使用xml.etree.ElementTree.XMLParser

from xml.etree.ElementTree import XMLParser

class Parser:                     # The target object of the parser

  min = 0
  max = 0
  store_max = False
  store_min = False

  def start(self, tag, attrib):   # Called for each opening tag.

    if self.store_max:
      self.max = attrib.get('v')
      self.store_max = False

    if self.store_min:
      self.min = attrib.get('v')
      self.store_min = False

    if attrib.get('v') == 'max':
      self.store_max = True
    if attrib.get('v') == 'min':
      self.store_min = True

  def end(self, tag):             # Called for each closing tag.
    pass                          # We do not need to do anything when tag is closing.

  def data(self, data):
    pass                          # We do not need to do anything with data.

  def close(self):    # Called when all data has been parsed.
    return self.min, self.max


xml = """<options>
    <option>
        <name v="clamp"/>
        <value v="0"/>
    </option>
    <option>
        <name v="default"/>
        <value v="10"/>
    </option>
    <option>
        <name v="max"/>
        <value v="10"/>
    </option>
    <option>
        <name v="min"/>
        <value v="0"/>
    </option>
    <option>
        <name v="step"/>
        <value v="1"/>
    </option>
</options>"""

target = Parser()
parser = XMLParser(target=target)
parser.feed(xml)
print(parser.close())