从多个xml文件中提取节点

从多个xml文件中提取节点,xml,bash,xpath,Xml,Bash,Xpath,我有三个结构类似的xml文件,我想使用xpath表达式提取这些文件中所有匹配的节点,并将它们写入第三个 你知道处理这个问题的好工具吗 我在想类似的事情 $supermagicxpathtool -x "//whoopdee" file1.xml file2.xml file3.xml > resultfile.xml 可以提取节点,但我不确定它是否可以这样加入结果。XPath只能选择节点,不能写入文件。 在XPath 1.0中,没有标准方法在属于多个XML文档的单个表达式中引用节点。如果

我有三个结构类似的xml文件,我想使用xpath表达式提取这些文件中所有匹配的节点,并将它们写入第三个

你知道处理这个问题的好工具吗

我在想类似的事情

$supermagicxpathtool -x "//whoopdee" file1.xml file2.xml file3.xml > resultfile.xml

可以提取节点,但我不确定它是否可以这样加入结果。

XPath只能选择节点,不能写入文件。

在XPath 1.0中,没有标准方法在属于多个XML文档的单个表达式中引用节点。如果承载XPath的编程语言是XSLT,那么这三个XML文档的文档节点可以位于三个独立的
xsl:variable
s:
$doc1
$doc2
$doc3

$doc1//whoopdee | $doc2//whoopdee | $doc3//whoopdee
或者,可以直接使用XSLT
document()
函数:

    document('file1.xml')//whoopdee 
  | document('file2.xml')//whoopdee 
  | document('file3.xml')//whoopdee
要输出上述任一XPath表达式的结果,使用XSLT只需编写:

<xsl:copy-of select="$doc1//whoopdee | $doc2//whoopdee | $doc3//whoopdee">


在XPath2.0中,可以使用标准的
doc()
函数,而不依赖于XPath的宿主

命令行

可以使用任何允许命令行实例化的XSLT处理器。大多数XSLT处理器都允许这样做。它们还允许在命令行中传递简单的参数——通常采用
name=value
格式。最后,大多数XSLT处理器允许将结果的目标文件指定为选项。以下是有关其命令行用法的Saxon文档的链接:


xmlstarlet可以将一个节点复制到另一个文档(因此这似乎是解决方案的第一步):

要将所有匹配节点提取为纯(无标记)文本或xsl,我们可以执行以下操作:

xmlstarlet sel -t -m "//whoopdee" -v '@*' -v '.' -n file1.xml > resultfile

xmlstarlet sel -C -t -m "//whoopdee" -v '@*' -v '.' -n file1.xml > resultfile.xsl
xml tr resultfile.xsl file1.xml

因此,在我之前发布的xmlstarlet的基础上,我似乎可以这样完成工作:

xmlstarlet sel -R -t -c / -c "document('file2.xml')" -c "document('file3.xml')" file1.xml | \
       xmlstarlet sel -R -t -c /xml-select/*/whoopdee - | xmlstarlet fo > resultfile.xml 

xmlstarlet val resultfile.xml

使用xml coreutils包的xml cat增加了Unix的外观:

xml-cat file1.xml file2.xml file3.xml | \
   xmlstarlet sel -R -t -c /root/whoopdee - | \
   xmlstarlet fo > resultfile.xml 

您似乎正在寻找位于Ubuntu中的包
libxml xpath perl
中的工具
xpath
,很可能是基于Debian和的发行版

xpath [-s suffix] [-p prefix] [-q] -e query [-e query] ... [file] ...

我认为也可以创建一个。没什么大不了的,至少在C。顺便说一句,如果你能说出目的,可能更简单的选择也可以出来。对不起!C#帮不了你。我不知道bash与unix平台有关“亲爱的XMLStarlet用户,您可能已经注意到XMLStarlet的开发有些停滞”对不起,但这不是一个选项。看起来xgrep接近我想要的东西它不是一个文字处理器,它需要不断添加功能以跟上竞争对手。它完成了它应该做的工作。这不是“停滞”,这是“维护模式”。
xml-cat file1.xml file2.xml file3.xml | \
   xmlstarlet sel -R -t -c /root/whoopdee - | \
   xmlstarlet fo > resultfile.xml 
xpath [-s suffix] [-p prefix] [-q] -e query [-e query] ... [file] ...