我有三個相似結構的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