2010-07-01 69 views
1

我有三个相似结构的xml文件,我想使用xpath-expression来提取这些文件中的所有匹配节点并将它们写入第三个文件。从多个xml文件中提取节点

你知道一个好的工具来处理吗?

我想到的是像

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

我觉得也可以创建一个。至少在C#中没有那么重要。顺便说一句,如果你能说出的目的,可能是一个更简单的选择也可以出来。 – IsmailS 2010-07-01 15:13:07

+0

对不起! C#不会帮助你。我不知道bash与unix平台有什么关系 – IsmailS 2010-07-01 15:16:04

回答

2

xmlstarlet可以提取节点,但我不能肯定它可以连接的结果类似。

+0

“亲爱的XMLStarlet用户,您可能已经注意到xmlstarlet的开发已经停滞了一段时间” 对不起,但这不是一个选项。 – er4z0r 2010-07-01 15:24:06

+0

看起来像xgrep接近我正在寻找 – er4z0r 2010-07-01 15:31:07

+1

它不是一个文字处理器,需要不断增加功能,以跟上Joneses。它做它应该的工作。这不是“停滞”,这是“维护模式”。 – 2010-07-01 15:32:00

2

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"> 

<xsl:copy-of select= 
    "document('file1.xml')//whoopdee 
    | document('file2.xml')//whoopdee 
    | document('file3.xml')//whoopdee 
"> 

在XPath 2.0中,可以使用标准的doc()函数,并且不依赖于XPath的主机。

命令行

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

http://www.saxonica.com/documentation/using-xsl/commandline.html

0

xmlstarlet可以一个节点拷贝到另一个文档(因此这似乎是一个第一步的溶液):

# code example from: 
# "How to copy a node to another document", 
# http://sourceforge.net/projects/xmlstar/forums/forum/226076/topic/3558346 

xml sel -R -t -c/-c "document('f2.xml')" f1.xml | \ 
     xml ed -m /xml-select/Module_0 /xml-select/cnpsXML/Destinations/Module_0/Filter_1 | \ 
     xml sel -t -c /xml-select/* - | xml fo 

# In pseudo code: 
# 1. Combine both documents into one (using -R to keep the combo a valid XML file - genius!) 
# 2. Move the element from f2.xml to its final destination 

提取所有匹配节点,普通(无标记)文本或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 
0

所以建立在我以前的帖子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 
1

使用XML-coreutils软件包增加了Unix的XML的猫看上去&感受:

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

你似乎在寻找工具xpath,它位于Ubuntu的软件包libxml-xpath-perl中,很可能是基于Debian和发行版的发行版。

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