2

我已经阅读了 xpath 和 lxml 上的大量线程,但对于以下 xml,我似乎仍然遗漏了一些东西。

我需要拉出“rt-entry”项目以及它下面的信息。

我在 python 中尝试以下操作:

from lxml import etree

x="""
<rpc-reply xmlns:junos="http://xml.juniper.net/junos/12.3R5/junos">
    <route-information xmlns="http://xml.juniper.net/junos/12.3R5/junos-routing">
        <route-table>
            <table-name>x.inet.0</table-name>
            <destination-count>4990</destination-count>
            <total-route-count>51326</total-route-count>
            <active-route-count>4990</active-route-count>
            <holddown-route-count>0</holddown-route-count>
            <hidden-route-count>0</hidden-route-count>
            <rt junos:style="detail">
                <rt-destination>x.x.x.x</rt-destination>
                <rt-prefix-length>14</rt-prefix-length>
                <rt-entry-count junos:format="2 entries">2</rt-entry-count>
                <rt-announced-count>1</rt-announced-count>
                <tsi junos:indent="0">
                    KRT in-kernel x.x.x.x/x -> {indirect(x)}
                    Page 0 idx 0 Type 1 val b4557d8
                        Flags: Nexthop Change
                        Nexthop: Self
                        Localpref: 100
                        AS path: [x] I
                    Path x.x.x.x from x.x.x.x Vector len 4.  Val: 0
                </tsi>
                <rt-entry>
                    <active-tag>*</active-tag>
                    <current-active/>
                    <last-active/>
                    <protocol-name>BGP</protocol-name>
                    <preference>170</preference>
                    <preference2>-101</preference2>
                    <nh-type>Indirect</nh-type>
                    <nh-address>x</nh-address>
                    <nh-reference-count>123</nh-reference-count>
                    <nh-kernel-id>0</nh-kernel-id>
                    <gateway>x.x.x.x</gateway>
                    <nh-type>Router</nh-type>
                    <nh-index>1538</nh-index>
                    <nh junos:indent="16">
                        <nh-string>Next hop</nh-string>
                        <to>x.x.x.x</to>
                        <via>x.x</via>
                        <selected-next-hop/>
                        <session>63</session>
                    </nh>
                    <protocol-nh junos:indent="16">
                        <to>x.x.x.x</to>
                        <indirect-nh>bac2c40 1048576 INH Session ID: 0xa7</indirect-nh>
                    </protocol-nh>
                    <rt-entry-state>Active Int Ext</rt-entry-state>
                    <peer-as>x</peer-as>
                    <announce-bits>3</announce-bits>
                    <announce-tasks>0-KRT 2-BGP_RT_Background 3-Resolve tree 7 </announce-tasks>
                    <as-path>AS path: I
                    </as-path>
                    <bgp-rt-flag>Accepted</bgp-rt-flag>
                    <local-preference>100</local-preference>
                    <peer-id>x.x.x.x</peer-id>
                    <indirect-nh-count>1</indirect-nh-count>
                    <protocol-nh junos:indent="24">
                        <to>x.x.x.x</to>
                        <indirect-nh>bac2c40 1048576 INH Session ID: 0xa7</indirect-nh>
                        <forwarding-nh-count>1</forwarding-nh-count>
                        <nh-type>Router</nh-type>
                        <nh-index>1538</nh-index>
                        <nh junos:indent="8">
                            <nh-string>Next hop</nh-string>
                            <to>x.x.x.x</to>
                            <via>x.x</via>
                            <session>63</session>
                        </nh>
                        <output>
                                        x.x.x.x/x Originating RIB: x.inet.0
                                          Node path count: 1
                                          Forwarding nexthops: 1
                                            Next hop type: Interface
                                            Nexthop: via x.x
                        </output>
                    </protocol-nh>
                </rt-entry>
            </rt>
        </route-table>
    </route-information>
    <cli>
        <banner>{master}</banner>
    </cli>
</rpc-reply>
"""

root=etree.fromstring(x)
print(root.xpath('//rt-entry[current-active]'))

但是,我收到一个空列表。我的 xpath 错误,或者我错误地使用了 lxml。

任何帮助表示赞赏。

4

1 回答 1

4

尝试使用命名空间前缀:

print (root.xpath('//junos-routing:rt-entry',namespaces={"junos-routing":"http://xml.juniper.net/junos/12.3R5/junos-routing"}))

参考: http: //lxml.de/xpathxslt.html

于 2017-02-04T05:58:19.843 回答