8

R を使用して XML ドキュメントを解析しました。たとえば、次のようになります。

library(XML)
f = system.file("exampleData", "mtcars.xml", package="XML")
doc = xmlParse(f)

XPath 式を使用して、ドキュメント内の特定のノードを選択できます。

> getNodeSet(doc, "//record[@id='Mazda RX4']/text()")
[[1]]
   21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 

    attr(,"class")
    [1] "XMLNodeSet"

しかし、結果を R 文字ベクトルに変換する方法がわかりません。

> as.character(getNodeSet(doc, "//record[@id='Mazda RX4']/text()"))
[1] "<pointer: 0x000000000e6a7fe0>"

内部ポインターから C オブジェクトへのテキストを取得するにはどうすればよいですか?

4

2 に答える 2

5

を使用しxmlValueます。クラスが何であるかを確認するのに役立つ例の拡張は次のとおりです。

v <- getNodeSet(doc, "//record[@id='Mazda RX4']/text()")
str(v)
#List of 1
#$ :Classes 'XMLInternalTextNode', 'XMLInternalNode', 'XMLAbstractNode' <externalptr> 
#- attr(*, "class")= chr "XMLNodeSet"
v2 <- sapply(v, xmlValue)  #this is the code chunk of interest to you
v2
#[1] "   21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4"
str(v2)
#chr "   21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4"
于 2012-07-12T15:56:44.463 に答える
2

以下も機能します: getNodeSet() と sapply(v,xmlValue) の代わりに、xpathApply を使用して xmlValue を引数として追加できます。

doc = xmlParse(f)
xpathApply(doc,"//record[@id='Mazda RX4']/text()")

[[1]]
   21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4 

attr(,"class")
[1] "XMLNodeSet"

xpathApply(doc,"//record[@id='Mazda RX4']/text()",xmlValue)

[[1]]
[1] "   21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4"

これはリスト内の文字オブジェクトです。リストから外し、1 つ以上のスペースの正規表現で文字列を分割し、再度リストから外して as.numeric() することにより、数値オブジェクトのベクトルに変換できます。

 as.numeric(unlist(strsplit(unlist(v)," +")))
 [1]     NA  21.00   6.00 160.00 110.00   3.90   2.62  16.46   0.00   1.00   4.00   4.00
于 2015-04-30T00:01:42.957 に答える