2017-04-24 1 views
0

2mil 라인 XML 파일의 시작과 끝 부분에 루트 태그를 추가하여 파이썬 코드로 파일을 올바르게 처리 할 수 ​​있습니다. <root> 태그를 Python을 사용하여 XML 문서에 추가

은 내가 previous post에서이 코드를 사용하여 시도,하지만 난 오류 "XMLSyntaxError를 : 추가 내용을 문서, 라인 __의 끝에서, 1 열"는 무엇입니까 나는이 문제를 어떻게 해결합니까

를? 아니면 내 큰 XML 문서의 처음과 끝에 루트 태그를 추가하는 더 좋은 방법이 있습니까?

import lxml.etree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 
newroot = ET.Element("root") 
newroot.insert(0, root) 
print(ET.tostring(newroot, pretty_print=True)) 

내 테스트 XML은

<pub> 
    <ID>75</ID> 
    <title>Use of Lexicon Density in Evaluating Word Recognizers</title> 
    <year>2000</year> 
    <booktitle>Multiple Classifier Systems</booktitle> 
    <pages>310-319</pages> 
    <authors> 
     <author>Petr Slav&iacute;k</author> 
     <author>Venu Govindaraju</author> 
    </authors> 
</pub> 
<pub> 
    <ID>120</ID> 
    <title>Virtual endoscopy with force feedback - a new system for neurosurgical training</title> 
    <year>2003</year> 
    <booktitle>CARS</booktitle> 
    <pages>782-787</pages> 
    <authors> 
     <author>Christos Trantakis</author> 
     <author>Friedrich Bootz</author> 
     <author>Gero Strau&szlig;</author> 
     <author>Edgar Nowatius</author> 
     <author>Dirk Lindner</author> 
     <author>H&uuml;seyin Kem&acirc;l &Ccedil;akmak</author> 
     <author>Heiko Maa&szlig;</author> 
     <author>Uwe G. K&uuml;hnapfel</author> 
     <author>J&uuml;rgen Meixensberger</author> 
    </authors> 
</pub> 
+1

test.xml 문서에는 루트 요소가 없으므로 XML이 아니며 파싱 할 수 없습니다. – mzjn

+0

@mzjn 포인트를 놓친 경우 루트 태그를 추가하려고 시도하여 XML로 읽을 수 있습니다. – douglasrcjames

+0

글쎄요, 요점은 루트 요소를 추가하기 전에 test.xml을 XML로 구문 분석하려고했기 때문입니다. 그래서 당신은 오류가 발생했습니다. – mzjn

답변

1

내가 최고 수준에 하나의 A 요소가 있기 때문에 그 책략이 작동하는지 생각한다. 다행스럽게도 2 백만 라인이 있더라도 필요한 라인을 쉽게 추가 할 수 있습니다.

이렇게하면 lxml 파서가 악센트 부호가있는 문자를 처리 할 수없는 것으로 나타났습니다. 나는 그 (것)들을 anglicise하기 위하여 부호를 추가했다.

import re 

def anglicise(matchobj): return matchobj.group(0)[1] 

outputFilename = 'result.xml' 

with open('test.xml') as inXML, open(outputFilename, 'w') as outXML: 
    outXML.write('<root>\n') 
    for line in inXML.readlines(): 
     outXML.write(re.sub('&[a-zA-Z]+;',anglicise,line)) 
    outXML.write('</root>\n') 

from lxml import etree 

tree = etree.parse(outputFilename) 
years = tree.xpath('.//year') 
print (years[0].text) 

편집 : &amp;를 교체 피하기 위해이 버전으로 anglicise를 교체합니다.

def anglicise(matchobj): 
    if matchobj.group(0) == '&amp;': 
     return matchobj.group(0) 
    else: 
     return matchobj.group(0)[1] 
+0

굉장! 그러나 모든 파일 출력을 얻는 중, 큰 XML 파일에 '&'에 대해 '&'이라는 항목이 있고 코드에서이 파일을 'a'문자로 변환하고 있습니다. 나는 당신의 코드의'outXML.write (re.sub ('& [a-z] +;', anglicise, line))'부분을 이해하지 못한다. – douglasrcjames

+0

편집을 참조하십시오. –

+0

멋지게 작동합니다. 정말 고맙습니다 ! – douglasrcjames