我有一个非XML文件,我想在其中添加一个XML部分。该文件由另一个应用程序创建,我想创建并附加一个xml部分(在文件的中间)。然后,我需要能够将xml部分作为普通的xml读取。我不确定这是否可能。
代码是用python编写的。
settings = XmlReaderSettings()
settings.DtdProcessing = DtdProcessing.Ignore
reader = XmlReader.Create(DXFfile, settings)
while reader.Read():
if reader.NodeType == XmlNodeType.Element:
if reader.Name=="NAME":
reader.Read()
plog(reader.Value + "\n");
一旦我运行它就会给我以下错误:
XmlException:根级别的数据无效。第1行,第3位。
以下是已编辑文件的xml部分:
0
EMPORT
999
<PORTLIST><HPORT><NAME>PORT TEST</NAME></HPORT></PORTLIST>
0
SEQEND
答案 0 :(得分:1)
使用lxml的示例:
#!/usr/bin/env python
import lxml.etree as etree
import sys
input_filename = sys.argv[1]
output_filename = sys.argv[2]
output_file = open(output_filename, 'w')
for line in open(input_filename, 'r').readlines():
line = line.rstrip('\n')
handled = False
if line and line[0] == '<':
try:
xml_el = etree.fromstring(line)
name = xml_el.find('.//NAME')
if name is not None:
print 'Found name:', name.text
# Add a new XML element under HPORT, and print
hport_el = xml_el.find('.//HPORT')
if hport_el is not None:
new_el = etree.SubElement(hport_el, 'NewElement')
new_el.text = 'Content Here'
print >>output_file, etree.tostring(xml_el)
handled = True
except lxml.etree.XMLSyntaxError:
pass # this line wasn't a valid standalone XML document
if not handled:
print >>output_file, line
需要注意的重要事项:
lxml.etree.fromstring()
将其反序列化为DOM对象,lxml.etree.Element.find()
以查找我们要在其中查询的元素,并lxml.etree.SubElement()
进行更新我们在原地阅读的内容(在这种情况下添加一个新元素)。如果您想更改现有元素的内容,而不是添加新元素,您也可以轻松地执行此操作。lxml.etree.tostring()
将其转换回字符串。运行
./update-xml-subsections input-file output-file
...使用您给定的输入文件将发出包含以下内容的输出文件:
0
EMPORT
999
<PORTLIST><HPORT><NAME>PORT TEST</NAME><NewElement>Content Here</NewElement></HPORT></PORTLIST>
0
SEQEND