1

この優れた例を使用して、いくつかの XML コードを R データ フレームに変換しようとしています。残念ながら、自己終了タグがこの変換を妨げているようで、XML (および R XML パッケージ) についての私の理解はせいぜい初心者です。

w3schools のこのページによると、自己終了タグは XML で合法であるように見えるため、解析しようとしているコードはそれほど奇抜ではありません。

以下の R コードは、私が経験している問題を引き起こします。タグを削除する<AlternateText/>と、コードは期待どおりに機能します。

また、奇妙なことに、に変更すると<AlternateText xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>、それも機能します。その動作は期待されていますか?

オブジェクトからすべての自己終了タグを単純に削除するかx、エラーが発生しないようにタグを付け直して、効果的<AlternateText/><AlternateText></AlternateText>.

x <- 
    '<outer>
        <ProviderURL>
          <URLCode>Valid</URLCode>
          <URLAddress>http://mypage.com</URLAddress>
          <AlternateText/>
        </ProviderURL>
    </outer>'

library( plyr )
library( XML )


y <- 
    xmlTreeParse( 
        x , 
        asText = TRUE , 
        useInternalNodes = TRUE
    )

ldply( xmlToList( y ) , data.frame )

このコードブロックは私に与えます:

Error in data.frame(URLCode = "Valid", URLAddress = "http://mypage.com",  : 
  arguments imply differing number of rows: 1, 0
4

2 に答える 2

0

例のコードを使用してxmlを解析すると、探しているタグがすぐそこにあります。私はそれがあなたに問題を与えているものだとは思わない

y <- xmlTreeParse(x, asText=TRUE, useInternalNodes=TRUE)

xmlToList(y)

# $ProviderURL
# $ProviderURL$URLCode
# [1] "Valid"

# $ProviderURL$URLAddress
# [1] "http://mypage.com"

# $ProviderURL$AlternateText  
# NULL    <~~~~~~~~~~~~~~~~~~~~~ It's Right There

これは役立つはずです:

y.list <- xmlToList(y)
y.list$ProviderURL$AlternateText <- NA
ldply(y.list, data.frame)

問題は自動終了タグではありません。問題は、NULL値のリストがあり、それがldplyを台無しにしていることです。通常、リストにはNULL値がありません(つまり、NULLを割り当てると、リストから値が削除されることがよくあります)。

したがって、代わりに代替値を割り当てる場合は、ldplyで問題ありません。または、NULLを割り当てると、リストから削除されます。

于 2013-03-08T09:09:43.617 に答える
0

最後の編集で @RicardoSaporta が述べたように、問題はリスト要素の 1 つに NULL があるためです。代わりに、使用できる data.frame を取得しますunlist

 unlist(xmlToList( y ))
   ProviderURL.URLCode ProviderURL.URLAddress 
               "Valid"    "http://mypage.com" 

または使用してxmlToDataFrame

xmlToDataFrame(y)


  URLCode        URLAddress AlternateText
1   Valid http://mypage.com     

PS

xmlTreeParsewithuseInternalNodes = TRUEは単純なものに置き換えることができることに注意してくださいxmlParse

y <- 
    xmlParse( 
        x , 
        asText = TRUE  
    )
于 2013-03-08T09:15:18.287 に答える