Как получить блок XML в файле XML, используя ключевое слово
У меня есть файл Sample.xml, который содержит много сервисов внутри, и структура выглядит так
ПРОБЛЕМА: ВХОД: ВЫВОД ИМЕНИ ОЧЕРЕДИ: СЕРВИСНЫЙ БЛОК
образец ВВОДА: 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
2 ответа
Решение
Команда почти правильная, вам нужно только исправить выражение 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
Альтернативный инструмент для этой цели - 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>