2013-12-19 10 views
10

機能に対して、xmlParse機能をいつ使用したいですか?また、パラメータ値がuseInternalNodes=TRUEまたはasText=TRUEの場合は便利ですか?例えばR XML Packageでは、xmlParseとxmlTreeParseの違いは何ですか?

library("XML") 
nct_url <- "http://clinicaltrials.gov/ct2/show/NCT00112281?resultsxml=true" 
xml_doc <- xmlParse(nct_url, useInternalNodes=TRUE) 

対は

doc <- xmlTreeParse(getURL(nct_url), useInternalNodes=TRUE) 
top <- xmlRoot(doc) 
top[["keyword"]] 
xmlValue(top[["start_date"]]) 
xmlValue(top[["location"]]) 

人々が... $ $のdoc $子供を経由してトラバーサルを非繰り返しノードを取得するためxmlTreeParse機能を使用しているようです。しかし、私はそれぞれのアプローチがいつ最良であるかを理解していません。 XMLの解析は、Rをほとんど放棄してPythonを学ぶ理由の1つです。本の購入を余儀なくされることなく、ダミーの例が欠けている。

答えて

12

私はXMLの専門家ではないので、この回答はXMLパッケージに関する私の経験に基づいています。

  • xmlParseは、引数useInternalNodesがTRUEに設定されているxmlTreeParseのバージョンです。
  • Rオブジェクトを取得する場合は、xmlTreeParseを使用してください。 xmlドキュメントの部分的な部分だけを抽出したい場合は、これはあまり効率的ではありません。
  • Rオブジェクト(Cポインタのみ)を取得したくない場合は、xmlParseを使用します。しかし、結果を操作するためにはxpathの塩基を知っている必要があります。
  • ファイルまたはURLが入力されていないテキストがある場合はasText=TRUEを使用してください。
  • ここ

私は2つの機能の違いを示した例:

txt <- "<doc> 
      <el> aa </el> 
     </doc>" 
library(XML) 
res <- xmlParse(txt,asText=TRUE) 
res.tree <- xmlTreeParse(txt,asText=TRUE) 

今すぐ2つのオブジェクトを検査:

class(res) 
[1] "XMLInternalDocument" "XMLAbstractDocument" 
> class(res.tree) 
[1] "XMLDocument"   "XMLAbstractDocument" 

あなたはそれがresは見るには、内部文書です。 Cオブジェクトへのポインタです。 res.treeはRオブジェクトです。あなたはそれを点検するための有効なxpath要求や論文機能(xpathApplyxpathSApplygetNodeSet)のいずれかを使用する必要があり、解像度については

res.tree$doc$children 
$doc 
<doc> 
<el>aa</el> 
</doc> 

:あなたはこのようにその属性を取得することができます。例えば:

xpathApply(res,'//el') 

あなたは有効なXMLノードを作成したら、xmlValuexmlGetAttrは、...ノード情報を抽出するために適用することができます。したがって、この2つのステートメントは同等です:

## we have already an R object, just apply xmlValue to the right child 
xmlValue(res.tree$doc$children$doc) 
## xpathSApply create an R object and pass it to 
xpathSApply(res,'//el',xmlValue)  
関連する問題