【问题标题】:Error reading in XML file for special character parsing读取 XML 文件以进行特殊字符解析时出错
【发布时间】:2015-12-07 19:55:32
【问题描述】:

我目前正在阅读一个包含静态 XML 文件(数千个)的文件夹。

其中大部分格式正确,但有一些特殊字符我想屏蔽。例如,一个 XML 文件的 XML 代码无效,如下所示:

<?xml version="1.0" encoding="utf-8"?>
    <INQUIRY version="4.0">
        <AUTHENTICATION>
            <LICENSEKEY>XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</LICENSEKEY> 
            <PASSWORD>YYYYYYYYYYY</PASSWORD> 
        </AUTHENTICATION>
        <QUERY>
            <TRACKID>1-1-1</TRACKID> 
            <TYPE>VALID</TYPE>
            <CHANNEL>INTERNET</CHANNEL>
            <INQUIRYTYPE>O</INQUIRYTYPE>
            <DATA>
                <NAME>BARNES & NOBLE</NAME>
            </DATA>
        </QUERY>
    </INQUIRY>

我尝试用代码替换 &:

install.packages("XML")
library(XML)

location <- "C:/Users/Desktop/temp"
filenames=dir(location)

for (i in 1:length(filenames)){
   tmp <- gsub("&", "&amp;", readLines(paste0(location,"/",filenames[i])))
   data <- xmlParse(tmp)
   TMP<-xmlToDataFrame(nodes=getNodeSet(data,"//DATA"))
   DATAX_DF<-rbind(TMP,DATAX_DF)
}

结果如下:

Warning message:
In readLines(paste0(location, "/", filenames[i])) :
  incomplete final line found on 'C:/Users/Desktop/tmp/1-1-1_req.XML'

还有什么办法可以替代 & 号和/或关于为什么它将最后一行读取为不完整以便我不会收到警告的任何想法?

【问题讨论】:

  • 这是一个无效的 XML 文件。您可以使用validator 对其进行测试。该文件最初是如何生成的?
  • 抱歉,我快速解析了 XML 以删除敏感信息。假设它是一个有效的 XML 文件。解决方法确实有效,它只是在不完整的最后一行引发警告。
  • 我们不能仅仅假设它是有效的,因为你得到的错误清楚地表明它不是。如果您的 XML 文件有一个未转义的 & 符号,那么它不是一个有效的 XML 文件,它只是一个看起来像 XML 的文件。您应该首先弄清楚为什么以这种方式创建无效文件。关于最后一行不完整的消息只是一个警告。这只是意味着行尾没有换行符。这并不是真正的错误。

标签: xml r


【解决方案1】:

首先,根据 Section 4.6 Predefined Entities.of Extensible Markup Language (XML) 1.0 (Fifth Edition)

,XML 需要一个 & 而不是 &

xml验证器可以在这里找到w3schools xml validator

<DATA>
     <NAME>BARNES &amp; NOBLE</NAME>
</DATA>

其次是变量DF。如果 DF 为空(第一次调用),我不确定 DF 是否可以绑定到数据集?

这行得通

两个相同的 xml 文件,按照上面的修复(如上所述)

for (i in 1:length(filenames)){ 
    data <- xmlParse(paste0(location,"/",filenames[i]))   
    TMP<-xmlToDataFrame(nodes=getNodeSet(data,"//DATA")) 
    if (i==1) {   
        DF<-TMP 
    } else { 
        DF<-rbind(TMP,DF) 
    } 
}

结果是

 str(DF)
'data.frame':   2 obs. of  1 variable:
 $ NAME: Factor w/ 1 level "BARNES & NOBLE": 1 1

我希望这就是您要找的东西?

一切顺利

【讨论】:

  • 对不起。我知道如何替换&。试图以一种不会引发任何警告的自动化方式弄清楚如何做到这一点。
  • 嗨@JJFord3 你能发布你需要做什么吗?而不是代码?
【解决方案2】:

假设您可以预处理或修改数据,请尝试将 &amp; 替换为以下内容:

&amp;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    相关资源
    最近更新 更多