2017-04-24 131 views
0

嘗試將根標記添加到2mil行XML文件的開頭和結尾,以便可以使用我的Python代碼正確處理該文件。將<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元素。幸運的是,即使有兩百萬行,添加所需的行數也很容易。

在這樣做我注意到,lxml解析器似乎無法處理重音字符。我在那裏添加了代碼來表達他們的意見。

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) 

編輯:更換anglicise到這個版本,避免更換&amp;

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

相關問題