2013-12-09 61 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