我有一个Sample.xml文件,其中包含很多服务 结构看起来像这样
问题: INPUT:QUEUE NAME 输出:服务块
样品 INPUT:ABC.getme2
输出:
<service name="GETME2" min="1" max="10" idleTime="300" backend="ABC">
<handlerContainer className="com.abc.xyz.wqere.abcqwere">
<handler className="com.abc.xyz.qweqweqwe.werwerwerwer"/>
</handlerContainer>
<mqListener queue="ABC.getme2" suggExpiry="30" minExpiry="4" maxExpiry="500" copyMessageId="true"/>
</service>
XML结构:
<?xml version="1.0" encoding="UTF-8"?>
<deploymentconfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<configfile>sample.xml</configfile>
<exceptionsFilterConfigFile>asdasd.xml</exceptionsFilterConfigFile>
<keyInfoConfigFile>asdasd.xml</keyInfoConfigFile>
<services>
<service name="GETME" min="1" max="10" idleTime="300" backend="ABC">
<handlerContainer className="com.abc.xyz.wqere.abcqwere">
<handler className="com.abc.xyz.qweqweqwe.werwerwerwer"/>
</handlerContainer>
<mqListener queue="ABC.getme" suggExpiry="30" minExpiry="4" maxExpiry="500" copyMessageId="true"/>
</service>
<service name="GETME2" min="1" max="10" idleTime="300" backend="ABC">
<handlerContainer className="com.abc.xyz.wqere.abcqwere">
<handler className="com.abc.xyz.qweqweqwe.werwerwerwer"/>
</handlerContainer>
<mqListener queue="ABC.getme2" suggExpiry="30" minExpiry="4" maxExpiry="500" copyMessageId="true"/>
</service>
. . . .a lot of services like this . . . .
. . . .a lot of services like this . . . .
. . . .a lot of services like this . . . .
. . . .a lot of services like this . . . .
</services>
<batchServices>
<batchService name="batch1">
<executor className="com.abc.xyz.qwer.qweqwewqe.ffdsdfsdfsdfsdf" />
</batchService>
<batchService name="batch2">
<executor className="com.abc.xyz.qwer.qweqwewqe.zxcsadsad" />
</batchService>
. . . .a lot of batch services like this . . . .
. . . .a lot of batch services like this . . . .
. . . .a lot of batch services like this . . . .
. . . .a lot of batch services like this . . . .
</batchServices>
<timerservices>
<timerservice> - a lot of timeservice
</timerservices>
<connectionPools>
<pool>
<name>asdasd</name>
<driver>oracle.jdbc.driver.OracleDriver</driver>
<url>$asdasd_URL</url>
<userId>$asdasd_USER</userId>
<password>$asdasd_PASSWORD</password>
<minConnections>0</minConnections>
<maxConnections>10</maxConnections>
<poolUrl>jdbc:asdsad:asdasdsad</poolUrl>
<testSql>select * from abc</testSql>
</pool>
. . a lot of pools. . .
</connectionpools>
</deploymentconfig>
我需要像这样grep一个xml块:
<service name="GETME" min="1" max="10" idleTime="300" backend="ABC">
<handlerContainer className="com.abc.xyz.wqere.abcqwere">
<handler className="com.abc.xyz.qweqweqwe.werwerwerwer"/>
</handlerContainer>
<mqListener queue="ABC.getme" suggExpiry="30" minExpiry="4" maxExpiry="500" copyMessageId="true"/>
</service>
我只需要提供队列名称
QUEUENAME=INSERT_HERE
grep ______________ $QUEUENAME. . .
我尝试了下面的答案
xmllint --xpath '//service[@name="GETME"]' Sample.xml
和
xmllint --xpath '/services/service[@name="GETME"]' Sample.xml
和
xmlstarlet sel -t -v "/services/service[@name='GETME']/mqListener/@queue" Sample.xml
但是不成功
这是输出:
Usage : xmllint [options] XMLfiles ...
Parse the XML files and output the result of the parsing
--version : display the version of the XML library used
--debug : dump a debug tree of the in-memory document
--shell : run a navigating shell
--debugent : debug the entities defined in the document
--copy : used to test the internal copy implementation
--recover : output what was parsable on broken XML documents
--noent : substitute entity references by their value
--noout : don't output the result tree
--path 'paths': provide a set of paths for resources
--load-trace : print trace of all external entites loaded
--nonet : refuse to fetch DTDs or entities over network
--nocompact : do not generate compact text nodes
--htmlout : output results as HTML
--nowrap : do not put HTML doc wrapper
--valid : validate the document in addition to std well-formed check
--postvalid : do a posteriori validation, i.e after parsing
--dtdvalid URL : do a posteriori validation against a given DTD
--dtdvalidfpi FPI : same but name the DTD with a Public Identifier
--timing : print some timings
--output file or -o file: save to a given file
--repeat : repeat 100 times, for timing or profiling
--insert : ad-hoc test for valid insertions
--compress : turn on gzip compression of output
--html : use the HTML parser
--xmlout : force to use the XML serializer when using --html
--push : use the push mode of the parser
--memory : parse from memory
--maxmem nbbytes : limits memory allocation to nbbytes bytes
--nowarning : do not emit warnings from parser/validator
--noblanks : drop (ignorable?) blanks spaces
--nocdata : replace cdata section with text nodes
--format : reformat/reindent the input
--encode encoding : output in the given encoding
--dropdtd : remove the DOCTYPE of the input docs
--c14n : save in W3C canonical format (with comments)
--exc-c14n : save in W3C exclusive canonical format (with comments)
--nsclean : remove redundant namespace declarations
--testIO : test user I/O support
--catalogs : use SGML catalogs from $SGML_CATALOG_FILES
otherwise XML Catalogs starting from
file:///etc/xml/catalog are activated by default
--nocatalogs: deactivate all catalogs
--auto : generate a small doc on the fly
--xinclude : do XInclude processing
--noxincludenode : same but do not generate XInclude nodes
--loaddtd : fetch external DTD
--dtdattr : loaddtd + populate the tree with inherited attributes
--stream : use the streaming interface to process very large files
--walker : create a reader and walk though the resulting doc
--pattern pattern_value : test the pattern support
--chkregister : verify the node registration code
--relaxng schema : do RelaxNG validation against the schema
--schema schema : do validation against the WXS schema
--schematron schema : do validation against a schematron
--sax1: use the old SAX1 interfaces for processing
--sax: do not build a tree but work just at the SAX level
Libxml project home page: http://xmlsoft.org/
To report bugs or get some help check: http://xmlsoft.org/bugs.html
这是版本
xmllint: using libxml version 20626
答案 0 :(得分:0)
该命令几乎是正确的,您只需修复XPATH表达式:
xmllint --xpath '//service[@name="GETME"]' Sample.xml
\ no slash hare
但是,您必须检查xmllint
是否实际支持XPATH:
$ xmllint --version
xmllint: using libxml version 20902
compiled with: Threads Tree Output Push Reader Patterns Writer
SAXv1 FTP HTTP DTDValid HTML Legacy C14N Catalog XPath XPointer
XInclude Iconv ISO8859X Unicode Regexps Automata Expr Schemas
Schematron Modules Debug Zlib Lzma
答案 1 :(得分:0)
用于此目的的替代工具是XMLStarlet:
xmlstarlet sel -t -c '//service[@name="GETME"]' -n <Sample.xml
顺便提一下,xmlstarlet
也可以输出XSLT,您可以将其应用于xsltproc,因此也可以在没有安装xmlstarlet的系统上输出。在这种情况下:
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<xsl:copy-of select="//service[@name="GETME"]"/>
<xsl:value-of select="' '"/>
</xsl:template>
</xsl:stylesheet>