我有三个相似结构的xml文件,我想使用xpath-expression来提取这些文件中的所有匹配节点并将它们写入第三个文件。从多个xml文件中提取节点
你知道一个好的工具来处理吗?
我想到的是像
$supermagicxpathtool -x "//whoopdee" file1.xml file2.xml file3.xml > resultfile.xml
我有三个相似结构的xml文件,我想使用xpath-expression来提取这些文件中的所有匹配节点并将它们写入第三个文件。从多个xml文件中提取节点
你知道一个好的工具来处理吗?
我想到的是像
$supermagicxpathtool -x "//whoopdee" file1.xml file2.xml file3.xml > resultfile.xml
xmlstarlet可以提取节点,但我不能肯定它可以连接的结果类似。
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
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
所以建立在我以前的帖子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软件包增加了Unix的XML的猫看上去&感受:
xml-cat file1.xml file2.xml file3.xml | \
xmlstarlet sel -R -t -c /root/whoopdee - | \
xmlstarlet fo > resultfile.xml
你似乎在寻找工具xpath
,它位于Ubuntu的软件包libxml-xpath-perl
中,很可能是基于Debian和发行版的发行版。
xpath [-s suffix] [-p prefix] [-q] -e query [-e query] ... [file] ...
我觉得也可以创建一个。至少在C#中没有那么重要。顺便说一句,如果你能说出的目的,可能是一个更简单的选择也可以出来。 – IsmailS 2010-07-01 15:13:07
对不起! C#不会帮助你。我不知道bash与unix平台有什么关系 – IsmailS 2010-07-01 15:16:04