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 在他上一次编辑中提到的那样,问题是因为您的列表元素之一有一个 NULL。作为替代,你可以使用一个 data.frameunlist

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

或使用xmlToDataFrame

xmlToDataFrame(y)


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

附言

注意xmlTreeParsewithuseInternalNodes = TRUE可以用一个简单的替换xmlParse

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