未转义的'<'不允许在R中的属性值错误

时间:2014-03-17 19:04:57

标签: xml r parsing

我有很多" raw"我需要读取数据表以处理一些摘要统计信息的XML格式的主题数据。我用于测试的程序给了我以下输出(文件中一个事件的片段):

    <Event>
      <Data name="Relation1" value="<"></Data>
      <Data name="Relation2" value="4    R"></Data>
      <Data name="Group" value="0"></Data>
      <Data name="CorrResult" value="S"></Data>
      <Data name="Response" value="S"></Data>
      <Data name="RT" value="787"></Data>
      <Data name="Result" value="C"></Data>
      <Data name="Gap" value="0"></Data>
      <Data name="IntraGap" value="0"></Data>
      <Data name="ISI" value="0"></Data>
    </Event>

第一个数据字段&#34; Relation1&#34;总是会有一个值为&#34;&lt;&#34;或&#34;&gt;&#34;。有没有办法让R认识到这是一个数据值,而不是新属性值的开头?我已经尝试过使用XML和XML2R软件包的许多东西,并且总是在一长串错误的顶部出现错误。

2 个答案:

答案 0 :(得分:3)

在XML&lt;或者&amp;用作价值观是严格违法的。还有更多并非严格违法,但最好避免。请改用实体引用。因此,您的XML文件会生成错误。 &lt;的实体引用是&lt;和&gt;是&gt;

如果无法更改输出过程,可以编写一个过程以基于文本的方式更改文件;我的意思是,逐行读取文件。如果检测到relation1,则更改第一个&lt;或者&gt;之后;之后它应该工作。我无法告诉你这是如何在R中完成的,因为我不懂语言。

我使用下面的来源作为参考。

http://www.w3schools.com/xml/xml_syntax.asp

答案 1 :(得分:0)

我从未回过头来发布我是如何做到的,所以我为此道歉。我最终将其解析为文本文件。它可能不是最优雅的解决方案,但它给了我完成论文的结果。

for(i in 1:length(filelist)) {
    #Parse raw data file
    xmlData <- readLines(filelist[i])
    tempTable <- data.frame(Event=1:64,stringsAsFactors=FALSE)
    temp <- read.table(text=as.character(xmlData[c(grep("Relation1",xmlData))]),sep="\"")
    tempTable[,"Relation1"] <- temp[-c(1,2,3,5)]
    tempTable[1,"SwTr"] = 0
    for(j in 2:64) { 
        if(tempTable[j,"Relation1"]==tempTable[j-1,"Relation1"])
            tempTable[j,"SwTr"] = 0 
        else 
            tempTable[j,"SwTr"] = 1 
    }
    temp <- read.table(text=as.character(xmlData[c(grep("RT",xmlData))]),sep="\"")
    tempTable[,"RT"] <- temp[-c(1,2,3,5)]
    temp <- read.table(text=as.character(xmlData[c(grep("\"Result\"",xmlData))]),sep="\"")
    tempTable[,"Result"] <- temp[-c(1,2,3,5)]
    tempLSW[i,"IDNum"] <- substr(filelist[i], start=10, stop=15)            #Get ID from filename
    swtRT <- sum(tempTable[tempTable$SwTr==1, "RT"])/sum(tempTable[,"SwTr"]==1) #Calc switch average
    nonSwt <- sum(tempTable[tempTable$SwTr==0, "RT"])/sum(tempTable[,"SwTr"]==0)    #Calc non-switch average
    tempLSW[i, "LSW.Cost"] <- round(swtRT-nonSwt, digits = 2)               #Set Switch cost in OSData
}