我有一个xml标签,它有多个名称和值对
这是我的XML标签,来自我的文件
<AsyncLogger name="org.mule.service.http" level="WARN"/>
使用下面的命令读取
- AsyncLogger名称及其值
- 日志级别及其值
cat log4j2.xml | perl -e 'while (<>) { next if (/<!--.*-->/);if (/<!--/) { while (<>) {last if (/-->/) }}else {print "$_"; }} ' | xmllint --format -| grep org.mule.service.http|awk -F'=' '{print $2,$4}'
这是它打印的内容
"org.mule.service.http" level
期望输出以逗号分隔的
org.mule.service.http,WARN
像这样使用xpath查询:
$ xmlstarlet sel -t -v 'concat(//AsyncLogger/@name, ",", //AsyncLogger/@level)' file.xml
org.mule.service.http,WARN
$ xmllint --xpath 'concat(//AsyncLogger/@name, ",", //AsyncLogger/@level)' /tmp/file.xml
org.mule.service.http,WARN
这样的XML片段很容易用库处理,例如XML::LibXML
perl -MXML::LibXML -wnE'
$xml = XML::LibXML->load_xml(string => $_);
for ( $xml->findnodes("//*") ) {
@attr = $_->attributes;
say "Attributes for node: ", $_->nodeName;
say for @attr
}
' file.xml
将问题中显示的字符串作为文件file.xml
中的一行打印
Attributes for node: AsyncLogger
name="org.mule.service.http"
level="WARN"
这是一个演示,因为我不确定输入是什么样的,需要什么输出。浏览XML::LibXML::Node (XML::LibXML
节点的基类)中使用的方法。
如果您确实需要每个节点的属性值以逗号分隔
perl -MXML::LibXML -wnE'
$xml = XML::LibXML->load_xml(string => $_);
for ( $xml->findnodes("//*") ) {
say join ",", map { $_->nodeValue } $_->attributes
}
' file.xml
这个打印
org.mule.service.http,WARN
请注意,我们从不需要节点名或诸如此类的东西;这可以用于任何xml。
代码可以进一步压缩,†也可以简化,因为输入似乎只是带有单个节点的代码片段。但是我更建议把这个程序放在一个文件中,这样可以使它有文档化,更好,更灵活。
†例如,在一个语句
perl -MXML::LibXML -wnE'say join(",", map { $_->nodeValue } $_->attributes)
for XML::LibXML->load_xml(string => $_)->findnodes("//*")' file.xml
但是,最好把程序写在一个文件中。
使用xpath
与concat()
和string()
功能:
$ xpath -q -e 'concat(string(//AsyncLogger/@name), ",", string(//AsyncLogger/@level))' file.xml
org.mule.service.http,WARN
需要libxml-xpath-perl
debian软件包或XML::XPath
Perl模块。
默认未安装
yq可用于您的任务。它是一个YAML处理器,也可以处理XML。
echo '<AsyncLogger name="org.mule.service.http" level="WARN"/>' | yq --input-format xml '.AsyncLogger | .+@name + "," + .+@level'
org.mule.service.http,WARN