2013-02-14 135 views
0

我想获取特定组件的一些值。例如,我想从下面的输出中只提取2个值(即Component - > name:paristrain和Stat - > TimeoutValue:value)。我试图用xpath来做到这一点,但我无法获得所需的输出。你能帮我解决这个问题吗?用元素树获取值

from xml.etree import ElementTree 

with open('rejexstats.xml', 'rt') as f: 
    tree = ElementTree.parse(f) 

for node in tree.iter(): 
    print node.tag, node.attrib 

此打印:

Statistics {} 
{http://www.rejex.com/stats}Server {'start': '2013-01-22T22:30:13.583', 'product': 'rejex', 'end': '2013-01-23T09:39:45.249', 'startup': '2013-01-22T22:30:13.583', 'name': 'localhost'} 
{http://www.rejex.com/statistics}Component {'subtype': 'Thread', 'type': 'Supplier', 'name': 'paristrain'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'TimeoutValue', 'value': '120'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'PendingRequests', 'value': '0'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'Session|0|SupplierTimeout', 'value': '0'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'Session|0|Errors', 'value': '0'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'Session|3|SupplierTimeout', 'value': '0'} 
{http://www.rejex.com/statistics}Stat {'type': 'entry', 'name': 'ApplyRulesErrors', 'value': '0'} 

XML文件

<Statistics> 
    <Server end="2013-02-14T07:06:35.533" name="localhost" product="regex" start="2013-02-13T22:30:12.982" startup="2013-02-13T22:30:12.982"> 
     <Component name="paristrain" subtype="Thread" type="Supplier"> 
      <Stat name="TimeoutValue" type="entry" value="120"/> 
      <Stat name="PendingRequests" type="entry" value="0"/> 
      <Stat name="Session|0|SupplierTimeout" type="entry" value="0"/> 
      <Stat name="Session|0|Errors" type="entry" value="0"/> 
      <Stat name="Session|3|SupplierTimeout" type="entry" value="0"/> 
      <Stat name="ApplyRulesErrors" type="entry" value="0"/> 
      <Stat name="LateResponses" type="entry" value="0"/> 
      <Stat name="CacheTries" type="entry" value="0"/> 
      <Stat name="Session|4|Errors" type="entry" value="0"/> 
      <Stat name="MaxActiveThreads" type="entry" value="0"/> 
      <Stat name="MaxPendingQueueSize" type="entry" value="10"/> 
      <Stat name="ValidResponses" type="entry" value="0"/> 
      <Stat name="TranslateResponses" type="entry" value="0"/> 

回答

0

您需要在您的XPath查询完整的命名空间:

for component in tree.iterfind('{http://www.rejex.com/statistics}Component'): 
    print component.attrib['name'] 

或者,你可以使用一个明确的命名空间映射,一个是ma PS前缀(选择)来命名空间URI:

nsmap = {'rej': 'http://www.rejex.com/statistics`} 

for stat in tree.iterfind('rej:Stat', namespaces=nsmap): 
    print stat.attrib['value'] 

rej前缀无论你传递为namespaces,然后转化到在第一个例子给出了相同的XPath查询抬头。

您可以在{namespace}的XPath预选赛展开寻找更复杂的比赛:

tree.find(
    "{http://www.rejex.com/statistics}Component[@name='paristrain']/" 
    "{http://www.rejex.com/statistics}Stat[@name='TimeoutValue']") 

应该返回具有属性name="TimeoutValue"其父是Component元素与name="paristrain"属性,例如Stat元素。

+0

事情是在我的XML文件中有这么多的组件。我只想获取组件paristrain的值和它的TimeoutValue:Value。 – 2013-02-14 10:20:03

+0

@fear_matrix:您可以使用名称空间前缀为其创建XPath表达式。 – 2013-02-14 10:20:40

+0

@fear_matrix:添加了未经测试的示例XPath表达式。您没有包含任何示例XML,因此很难为您测试。 – 2013-02-14 10:29:00