使用python的import xml.etree.ElementTree as ET
我很难找到一种获得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>
答案 0 :(得分:2)
基本上,您想要检查元素name
的属性是否等于min
或max
。如果是这样,您可以通过访问属性从value
元素获取值,并从密钥v
获取值。
以下是使用min
库从给定字符串(名为max
)中查找text
和lxml
值的代码段。
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())