2017-06-12 5 views
1

から特定の要素を抽出するために、どのように私はこのようなものがあります:彼らはたくさん長くなっていると私は<ValuesPeaks>の約300セットを持っている場合を除きXMLノード

<ValuesPeaks> 
    <Peak Start="244" Stop="248" Max="245" XValue="149" YValue="100.0000"/> 
    <Peak Start="361" Stop="368" Max="366" XValue="173.2" YValue="96.2713"/> 
<ValuesPeaks> 

を。どのようにして、すべてのXValue要素とYValue要素だけを抽出できますか?私はxpathSApply('//ValuesPeaks[XValue]',xmlValue)をやることができると思ったが、うまくいかなかった。私はそれからtoString.XMLNode()をやることができると思っていましたが、regexpr()substr()を使って私が望むものを得るのは非効率的です。私は何かが足りないと思う。あなたの専門知識を共有してください。ありがとう。

p<-list.files()[[1]] 
library(XML) 
x<-xmlParse(p) 
getNodeSet(x,'//Data/RESULT/*/*/*/ValuesPeaks/Peak') 
f<-xpathSApply(x,'//Data/RESULT/*/*/*/ValuesPeaks/Peak') 
t<-toString.XMLNode(f) 

答えて

2

これらの属性を抽出する方法はいくつかあります。それは結果がどのように見えるかによって異なります。ここにいくつかの例があります。

最初はxmlAttrs()を使用し、結果を部分集合にします。

xpathApply(doc, "//ValuesPeaks//*", function(x) xmlAttrs(x)[c("XValue", "YValue")]) 
# [[1]] 
#  XValue  YValue 
#  "149" "100.0000" 
# 
# [[2]] 
# XValue YValue 
# "173.2" "96.2713" 

2番目の方が効率的です。 XPath文を使用して2つの関連する属性を取得します。

xpathSApply(doc, "//ValuesPeaks//@*[name()='XValue' or name()='YValue']") 
# XValue  YValue  XValue  YValue 
#  "149" "100.0000" "173.2" "96.2713" 

あなたも行うことができます

sapply(unname(xmlToList(doc)), "[", c("XValue", "YValue")) 
#  [,1]  [,2]  
# XValue "149"  "173.2" 
# YValue "100.0000" "96.2713" 

データ:

txt <- '<ValuesPeaks> 
    <Peak Start="244" Stop="248" Max="245" XValue="149" YValue="100.0000"/> 
    <Peak Start="361" Stop="368" Max="366" XValue="173.2" YValue="96.2713"/> 
</ValuesPeaks>' 
library(XML) 
doc <- xmlParse(txt) 
+0

を行うことができます。それぞれのセットを別々に管理する方法はありますか?あなたが提供したオプションのうち、私は最初のものが好きですが、それぞれ個別にリストアップしていますが、データには300個のX/Y値があり、各セットの値を生成する方法はありますか? –

+0

@SpencerTrinh - これは、「ValuesPeaks」という名前のすべてのノードで有効です。先行する '//'がそれを処理します。 –

2

あなたのXMLが不正である(第2 ValuePeaksのタグが終了タグにする/を必要とします)、xml2::read_xmlを引き起こし文句を言うために。 read_htmlは、実際に自動的にかかわらず、それを修正しますので、あなたは偉大な答えリッチ、感謝

library(xml2) 
library(tidyverse) 

x <- '<ValuesPeaks> 
    <Peak Start="244" Stop="248" Max="245" XValue="149" YValue="100.0000"/> 
    <Peak Start="361" Stop="368" Max="366" XValue="173.2" YValue="96.2713"/> 
<ValuesPeaks>' 

df <- x %>% 
    read_html() %>% 
    xml_find_all('//peak') %>% { 
     data_frame(xvalue = xml_attr(., 'xvalue'), 
        yvalue = xml_attr(., 'yvalue')) 
    } %>% 
    type_convert() 

df 
#> # A tibble: 2 x 2 
#> xvalue yvalue 
#> <dbl> <dbl> 
#> 1 149.0 100.0000 
#> 2 173.2 96.2713