从XML标记读取多个名称值对



我有一个xml标签,它有多个名称和值对

这是我的XML标签,来自我的文件

<AsyncLogger name="org.mule.service.http" level="WARN"/>

使用下面的命令读取

  1. AsyncLogger名称及其值
  2. 日志级别及其值
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

但是,最好把程序写在一个文件中。

使用xpathconcat()string()功能:

$ xpath -q -e 'concat(string(//AsyncLogger/@name), ",", string(//AsyncLogger/@level))' file.xml
org.mule.service.http,WARN

需要libxml-xpath-perldebian软件包或XML::XPathPerl模块。

默认未安装

yq可用于您的任务。它是一个YAML处理器,也可以处理XML。

echo '<AsyncLogger name="org.mule.service.http" level="WARN"/>' | yq --input-format xml '.AsyncLogger | .+@name + "," + .+@level'

org.mule.service.http,WARN

相关内容

  • 没有找到相关文章

最新更新