2013-12-09 72 views
-2

我有一個關於xml解析的問題。 我的標籤有空格在例如R如何從xml標籤中提取信息

<item1 id=rt name ="th"> 
<point1>1254</point1> 
<point2>1254</point2> 
</item> 

如何從這個標籤中提取id和name?

我現在正在使用R,因爲我需要其餘的分析,但我也可以在perl和python中進行文件解析。 什麼是最佳解決方案?

+5

這是真實的數據?第一個標籤不是格式良好的XML,它缺少id值附近的引號。如果這是您擁有的數據,那麼您可能無法使用XML工具。 – mirod

回答

5

例如,你可以做到這一點,利用XML包:

tt <- '<?xml version="1.0" encoding="utf-8"?> 
<item id="rt" name ="th"> 
    <point1>1254</point1> 
    <point2>1254</point2> 
</item> 
' 

library(XML) 
xpathSApply(doc,'//item',xmlGetAttr,'id') 
[1] "rt" 

編輯

如果您的數據格式不正確,你應該像我上面做了重新格式化您的數據或閱讀數據逐行,並使用一些正則表達式提取信息(不建議使用XML標記來使用正則表達式)

tt <- '<item1 id=rt name ="th"> 
<point1>1254</point1> 
<point2>1254</point2> 
</item> 
    ' 

    ll <- readLines(textConnection(tt)) 
    gsub('.*id=(.*)[ ]name.*','\\1',ll[1]) 
[1] "rt" 
+0

您更改了輸入。正如@mirod在上面指出的那樣,輸入沒有'id =「rt」',而是'id = rt'。 – simbabque

+0

@simbabque是的,我知道XML格式非常糟糕(se item1 tag not item)。我的答案是向R初學者用戶展示如何使用XML包。 – agstudy

+1

夠公平的。在這種情況下,我建議指出(你現在做了什麼)。否則,他們可能會抱怨它無法正常工作。 ;-) – simbabque

0

正則表達式怎麼樣?

/=\K\W?\K\w+/g

=\K認定,但不保存=

\W?\K認定,但你的標籤之前不保存潛在的引號。

\w+是你的標籤。

您可以逐行讀取文件中的行和你的比賽保存到一個數組,像這樣:

my @matches = $line =~ /=\K\W?\K\w+/g;

然後用$matches[]訪問單個元素。

這,如果你想用它進一步發揮正則表達式在行動: http://regexr.com?37im8