2010-07-01 70 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] ...