从现有的非XML文件中读取XML

时间:2015-04-13 19:07:05

标签: python xml

我有一个非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

1 个答案:

答案 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

需要注意的重要事项:

  • 我们使用标准的每行I / O进行读写。
  • 如果我们阅读的是XML文档,我们使用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