Разбор XML файлов, у которых нет узла root в Python - PullRequest
1 голос
/ 15 февраля 2020

Мой клиент хочет, чтобы я проанализировал более 100,00 xml файлов и преобразовал их в текстовый файл.

Я успешно проанализировал пару файлов и преобразовал их в текстовый файл. Однако мне удалось это сделать, отредактировав xml и добавив <root></root> в файл xml.

Это может показаться неэффективным, поскольку для достижения желаемого результата мне нужно отредактировать около 100,00 xml файлов.

В любом случае мой код python распознает первый узел и читать его как узел root?

Я пытался использовать метод, показанный в Python XML Синтаксический анализ без 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 files:

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')

Остальная часть кода просто записывает в выходной текстовый файл.

Ответы [ 3 ]

1 голос
/ 15 февраля 2020

Не уверен насчет Python, но, вообще говоря, вы можете использовать SGML для вывода недостающих тегов, будь то на уровне элемента документа (root) или где-либо еще. Основным методом c является создание DTD для объявления элемента документа следующим образом:

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

, где важными являются индикаторы пропуска тега O O (буква O), сообщающие SGML, что и начальный, и теги конечных элементов для root могут быть опущены.

См. также следующие вопросы с более подробной информацией:

1 голос
/ 15 февраля 2020

Загрузите 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')
1 голос
/ 15 февраля 2020

Я не знаю, поддерживает ли анализатор Python DTD, но если это так, то один из подходов состоит в том, чтобы определить простой документ-оболочку, подобный этому

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

, и указать синтаксический анализатор на эту оболочку. документ вместо реальных данных. xml

...