【问题标题】:How to remove or re-tag self-closing XML tags when coercing XML code to a data frame with R使用 R 将 XML 代码强制到数据框时如何删除或重新标记自关闭 XML 标记
【发布时间】:2013-03-08 17:35:30
【问题描述】:

我正在尝试使用this excellent example 将一些 XML 代码转换为 R 数据框。不幸的是,自闭合标签似乎阻止了这种转换,我对 XML(和 R XML 包)的理解充其量只是新手。

根据this page at w3schools,看起来自闭合标签在 XML 中是合法的,所以我试图解析的代码并不是很不正常。

下面的 R 代码将产生我遇到的问题。如果您删除 <AlternateText/> 标记,代码将按我的预期工作。

另外,奇怪的是,如果你把它改成<AlternateText xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>,那么它也可以工作。这种行为是预期的吗?

我想简单地从对象x 中删除所有自闭合标签,或者我想重新标记它们,这样它们就不会导致错误——有效地将<AlternateText/> 更改为@987654327 之类的东西@。

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

【问题讨论】:

  • 我认为您发布的示例与您所描述的不符。你期望&lt;AlternateText/&gt; 的输出是什么?
  • @RicardoSaporta 查看编辑.. 当您运行该代码块时,您有什么不同吗?
  • 该错误与列表列表有关。不带 xml 标签。即,运行这个:aL &lt;- list(list(1:3, 1:2), 1:2); ldply(aL, data.frame)
  • @RicardoSaporta 我知道这就是它最终崩溃的地方,但问题出在自闭标签上——如果我能消除它们,它会解决吗? :)

标签: xml r


【解决方案1】:

正如@RicardoSaporta 在上一次编辑中提到的那样,问题是因为您的列表元素之一为 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

注意xmlTreeParseuseInternalNodes = TRUE 可以替换为简单的xmlParse

y <- 
    xmlParse( 
        x , 
        asText = TRUE  
    )

【讨论】:

  • 这给了我Opening and ending tag mismatch: ProviderURL line 2 and outer Premature end of data in tag outer line 1 Error: 1: Opening and ending tag mismatch: ProviderURL line 2 and outer 2: Premature end of data in tag outer line 1
  • 当我将您的代码复制并粘贴到 R 中时,我在 xmlParse 行收到该错误..(而且不仅仅是杂散的逗号)
【解决方案2】:

当您使用示例中的代码解析 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,它将从您的列表中删除。

【讨论】:

  • 感谢编辑..但我需要系统地删除它们。硬编码&lt;- NA 不会解决我的问题:(
猜你喜欢
  • 2011-09-15
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多