【问题标题】:How to parse an irregular XML file which has multiple lines如何解析具有多行的不规则 XML 文件
【发布时间】:2020-11-02 08:06:51
【问题描述】:

我有一个名为 file.txt 的 XML 文件,如下所示:

<message><header><msg-date></msg-date><msg-time></msg-time><sys-id></sys-id></header><record><remittance-details></remittance-details><source-sys-id></source-sys-id></message>
<message><header><msg-date></msg-date><msg-time></msg-time><sys-id></sys-id></header><record><remittance-details></remittance-details><source-sys-id></source-sys-id></message>
<message><header><msg-date></msg-date><msg-time></msg-time><sys-id></sys-id></header><record><remittance-details></remittance-details><source-sys-id></source-sys-id></message>
<message><header><msg-date></msg-date><msg-time></msg-time><sys-id></sys-id></header><record><remittance-details></remittance-details><source-sys-id></source-sys-id></message>
<message><header><msg-date></msg-date><msg-time></msg-time><sys-id></sys-id></header><record><remittance-details></remittance-details><source-sys-id></source-sys-id></message>

我需要将上面的文件解析成标准格式后在文件中进行处理:

<message>
  <header>
    <msg-date></msg-date>
    <msg-time></msg-time>
    <sys-id></sys-id>
  </header>
  <record>
    <remittance-details></remittance-details>
  </record>
</message>

更新了 xml 细节以避免混淆。 上面的例子只是为了理解,不能在这里分享全部细节(如果缺少任何标签,请忽略)。

我写了下面的代码来解析它:

import xml.etree.ElementTree as ET
import lxml.etree as etree
import os
import sys
File_path = os.path.abspath(__file__)
BASE_DIR = os.path.dirname(File_path)
file = os.path.join(BASE_DIR,'file.txt')
parser = etree.XMLParser(recover=True)
dom = etree.parse(file,parser=parser )
xmlstr = etree.tostring(dom, pretty_print=True)
with open (file, "wb") as f:
    f.write(xmlstr) 

但是,它解析文件的第一行而不解析整个文件,因此处理失败。因此,想了解如何解析文件中完整的xml行来处理它。

【问题讨论】:

  • 即使添加了根元素,输入仍然不是 XML。record 元素没有结束标记。
  • 我尝试使用上面引用的语句线程 @RMPR ,但这再次格式化我的第一行而不是整个文件。无论如何我们可以使用 xpath 找到一个标签及其主体来用 etree 解析它吗?
  • 由于您的文档根是标签Message,因此您可以通过扩展stlib类HTMLParser来使用专用解析器,如链接的答案中突出显示或遍历文件的所有行以实现你想要什么。如果您仍然需要正式的答复,请 Lmk。

标签: python xml python-2.7 xml-parsing


【解决方案1】:

你有几个问题:

  1. 您的文档中没有根。这可以通过用&lt;root&gt;..&lt;/root&gt; 包装xml 文本来解决
  2. 标签 remittance-details 未关闭,因此它是无效的 XML。

【讨论】:

  • 嗨,是的,我们没有 root,但所有的 xml 都以 开头和结尾。但是,对于汇款标签关闭(无效 XML),我并没有分享完整的 xml,因为它的巨大(在我的初始帖子中提到过)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 2011-01-03
  • 2022-12-11
  • 1970-01-01
相关资源
最近更新 更多