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