【发布时间】: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