使用 Python 将 <root> 标签添加到 XML 文档
Adding <root> tag to XML doc with Python
正在尝试将根标记添加到 200 万行 XML 文件的开头和结尾,以便可以使用我的 Python 代码正确处理该文件。
我尝试使用来自 previous post 的代码,但出现错误 "XMLSyntaxError: Extra content at the end of the document, line __, column 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í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ß</author>
<author>Edgar Nowatius</author>
<author>Dirk Lindner</author>
<author>Hüseyin Kemâl Çakmak</author>
<author>Heiko Maaß</author>
<author>Uwe G. Kühnapfel</author>
<author>Jürgen Meixensberger</author>
</authors>
</pub>
我怀疑这个策略行得通,因为最高层只有一个 A
元素。幸运的是,即使有 200 万行,也可以轻松添加所需的行。
在执行此操作时,我注意到 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
替换为该版本以避免替换 &
。
def anglicise(matchobj):
if matchobj.group(0) == '&':
return matchobj.group(0)
else:
return matchobj.group(0)[1]
正在尝试将根标记添加到 200 万行 XML 文件的开头和结尾,以便可以使用我的 Python 代码正确处理该文件。
我尝试使用来自 previous post 的代码,但出现错误 "XMLSyntaxError: Extra content at the end of the document, line __, column 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í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ß</author>
<author>Edgar Nowatius</author>
<author>Dirk Lindner</author>
<author>Hüseyin Kemâl Çakmak</author>
<author>Heiko Maaß</author>
<author>Uwe G. Kühnapfel</author>
<author>Jürgen Meixensberger</author>
</authors>
</pub>
我怀疑这个策略行得通,因为最高层只有一个 A
元素。幸运的是,即使有 200 万行,也可以轻松添加所需的行。
在执行此操作时,我注意到 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
替换为该版本以避免替换 &
。
def anglicise(matchobj):
if matchobj.group(0) == '&':
return matchobj.group(0)
else:
return matchobj.group(0)[1]