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"/>
4

1 に答える 1

0

XPath クエリに完全な名前空間を含める必要があります。

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

または、(選択した) プレフィックスを名前空間 URI にマップする、明示的な名前空間マッピングを使用することもできます。

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

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

プレフィックスは、rejとして渡したものでnamespaces検索され、最初の例で示したものと同じ XPath クエリに変換されます。

xpath 修飾子を展開して、{namespace}より複雑な一致を見つけることができます。

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

たとえば、親が属性を持つ要素である属性をStat持つ要素を返す必要があります。name="TimeoutValue"Componentname="paristrain"

于 2013-02-14T10:17:40.963 に答える