2015-12-07 3 views
1

В настоящее время я просматриваю папку статических XML-файлов (из них тысячи).Ошибка чтения в 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' 

Что еще нужно сделать, чтобы заменить амперсанд и/или какие-либо идеи о том, почему он читает последнюю строку как неполную, чтобы я не получал предупреждения?

+0

Тесно связана с http://stackoverflow.com/questions/33447676/rvest-package-read-html-function-stops-reading-at-symbol/33447817 # 33447817 –

+0

Это недопустимый XML-файл. Вы можете протестировать его с помощью [валидатора] (http://www.xmlvalidation.com/). Как создается этот файл в первую очередь? – MrFlick

+0

Извините, я быстро проанализировал XML, чтобы удалить важную информацию. Предположим, что это действительный XML-файл. Обход работает, он просто бросает предупреждения на неполную конечную строку. – JJFord3

ответ

0

Прежде всего XML нужен & вместо & согласно Section 4.6 Predefined Entities.of Extensible Markup Language (XML) 1.0 (Fifth Edition)

XML-валидатор можно найти здесь w3schools xml validator

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

Во-вторых переменной 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 

Я надеюсь, что это то, что вы ищете для?

Все лучшее

+0

Извините. Я получаю, как заменить &. Попытка выяснить, как это сделать автоматическим способом, который не вызывает никаких предупреждений. – JJFord3

+0

Привет @ JJFord3 Не могли бы вы разместить то, что вам нужно? в отличие от кода? – pnorton

0

Предполагая, что вы можете предварительно обработать или изменить свои данные, попробуйте заменить & следующим:

&amp; 
Смежные вопросы