解析Python中没有'root'节点的XML文件

问题描述 投票:1回答:3

我的客户希望我解析超过100,00个xml文件并将它们转换为文本文件。

我已经成功解析了几个文件,并将它们转换为文本文件。但是,我设法通过编辑xml并在xml文件中添加<root></root>来做到这一点。

这似乎效率很低,因为我必须编辑将近100,00个xml文件才能获得所需的结果。

反正我的python代码是否可以识别第一个节点并将其读取为根节点?

我已经尝试使用Python XML Parsing without root中显示的方法,但是我不完全了解它,也不知道在哪里实现。

XML格式如下:

<Thread>
   <ThreadID></ThreadID>
   <Title></Title>
   <InitPost>
        <UserID></UserID>
        <Date></Date>
        <icontent></icontent>
  </InitPost>
  <Post>
       <UserID></UserID>
       <Date></Date>
       <rcontent></rcontent>
  </Post>
</Thread>

这是我的有关如何解析XML文件的代码:

import os
from xml.etree import ElementTree


saveFile = open('test3.txt','w')

for path, dirs, files in os.walk("data/sample"):
   for f in files:
    fileName = os.path.join(path, f)
    with open(fileName, "r", encoding="utf8") as myFile:
        dom = ElementTree.parse(myFile)

        thread = dom.findall('Thread')

        for t in thread:

            threadID = str(t.find('ThreadID').text)
            threadID = threadID.strip()

            title = str(t.find('Title').text)
            title = title.strip()

            userID = str(t.find('InitPost/UserID').text)
            userID = userID.strip()

            date = str(t.find('InitPost/Date').text)
            date = date.strip()

            initPost = str(t.find('InitPost/icontent').text)
            initPost = initPost.strip()

        post = dom.findall('Thread/Post')

其余的代码只是写到输出文本文件。

python python-3.x xml xml-parsing elementtree
3个回答
0
投票

我不知道Python解析器是否支持DTD,但是如果支持,那么一种方法就是定义一个像这样的简单包装器文档

<!DOCTYPE root [
<!ENTITY e SYSTEM "realdata.xml">
]>
<root>&e;</root>

并将解析器指向此包装器文档,而不是指向realdata.xml


0
投票

不确定Python,但一般来说,无论是在文档元素(根)级别还是其他位置,您都可以使用SGML来推断丢失的标签。基本技术是像这样创建用于声明文档元素的DTD

<!DOCTYPE root [
  <!ELEMENT root O O ANY>
]>
<!-- your document character data goes here -->

[重要的是O O(字母O)标签省略指示符,告诉SGML,root的开始元素标签和结束元素标签都可以省略。

另请参阅以下问题以及更多详细信息:


0
投票

将xml作为文本加载,并用root元素包装。

'1.xml'是您发布的xml

from xml.etree import ElementTree as ET

files = ['1.xml'] # your list of files goes here
for file in files:
    with open(file) as f:
        # wrap it with <r>
        xml = '<r>' + f.read() + '</r>'
        root = ET.fromstring(xml)
        print('Now we are ready to work with the xml')
© www.soinside.com 2019 - 2024. All rights reserved.