Lange Jahre habe ich xmllint nur für einen XML Syntaxchecker gehalten, mit dem man xml auch in schön lesbare Form bringen kann. Als ich neulich mal wieder mit XML und speziell mit xpath zu tun hatte bin ich wieder darauf gestoßen und habe gemerkt, dass man mit xmllint auch XPath-Abfragen machen kann und das es eine Shell enthält.

Will man beispielsweise in einerKonfigurationsdatei des fwbuilder alle Interfaces haben, kann man folgendes machen:

$  xmllint --shell LokaleFW.fwb /
> setrootns /
> xpath //defaultns:IPv6
[…]
5  ELEMENT IPv6
    ATTRIBUTE id
      TEXT
        content=id3246X2054
    ATTRIBUTE name
      TEXT
        content=rantanplan:sixxs:ipv6
    ATTRIBUTE comment
      TEXT
        content=
    ATTRIBUTE ro
      TEXT
        content=False
    ATTRIBUTE address
      TEXT
        content=XXXX
    ATTRIBUTE netmask
      TEXT
        content=128
/>

Das setrootns sorgt dafür, das der in den fwbuilder Dateien definierte Default Namespace in XPath ansprechbar ist - xpath //IPv6 ergibt nämlich die leere Menge. (In Perl mit XML::LibXML muss man dafür übrigens etwas wie $xc->registerNs( fwb => 'http://www.fwbuilder.org/1.0/' ) machen)

Man kann aber auch kompliziertere Abfragen machen, z.B.

/ > xpath //defaultns:IPv6[@id='id3246X2054']
Object is a Node Set :
Set contains 1 nodes:
1  ELEMENT IPv6
    ATTRIBUTE id
      TEXT
        content=id3246X2054
    ATTRIBUTE name

Man kann übrigens auch im XML–Baum in einzelne Elemente wechseln:

/ > cd //defaultns:IPv6[@id='id3246X2054']
IPv6 > cat
<IPv6 id="id3246X2054" name="rantanplan:sixxs:ipv6" comment="" ro="False" address="XXX" netmask="128"/>
IPv6 > cd ..
Interface > cat
<Interface id="id3200X2054" dedicated_failover="False" dyn="False" label="IPv6Tunnel" mgmt="False" security_level="0" unnum="False" unprotected="False" name="sixxs" comment="" ro="False">
          <IPv6 id="id3246X2054" name="rantanplan:sixxs:ipv6" comment="" ro="False" address="XXX" netmask="128"/>
          <InterfaceOptions>
            <Option name="bonding_policy"/>
            <Option name="bondng_driver_options"/>
            <Option name="enable_stp">False</Option>
            <Option name="type">ethernet</Option>
            <Option name="vlan_id">0</Option>
            <Option name="xmit_hash_policy"/>
          </InterfaceOptions>
        </Interface>
Interface >

Alles in allem ein Tool, mit dem man wirklich gut XPath interaktiv testen kann, bevor man ans Programmieren geht