2009-10-29 2 views
4

У меня есть файл, который меняет его содержимое за короткое время. Но я бы хотел прочитать его, прежде чем он будет готов. Проблема в том, что это xml-файл (журнал). Поэтому, когда вы читаете это, возможно, что не все теги закрыты.Закройте все открытые теги xml

Я хотел бы знать, есть ли возможность правильно закрыть все открытые теги, чтобы в браузере не было проблем, чтобы показать его в браузере (с помощью xslt stylsheet). Это должно быть сделано с использованием включенных функций python.

ответ

5

Некоторые синтаксические анализаторы XML допускают инкрементный синтаксический анализ XML-документов, который является парсером, который может начать работать над документом, не требуя его полной загрузки. XMLTreeBuilder из модуля xml.etree.ElementTree в стандартной библиотеке Python является одним из таких парсеров: Element Tree

Как вы можете видеть в приведенном ниже примере, вы можете каждый раз передавать данные в парсер, когда вы читаете их с вашего ввода источник. Соответствующие методы крюка в вашем классе обработчика будет вызываться, когда различные XML «событие» происходит (метка начала, данные тега читать, тег закончился), что позволяет обрабатывать данные, как загружается документ XML:

from xml.etree.ElementTree import XMLTreeBuilder 
class MyHandler(object): 
    def start(self, tag, attrib): 
     # Called for each opening tag. 
     print tag + " started" 
    def end(self, tag): 
     # Called for each closing tag. 
     print tag + " ended" 
    def data(self, data): 
     # Called when data is read from a tag 
     print data + " data read" 
    def close(self):  
     # Called when all data has been parsed. 
     print "All data read" 

handler = MyHandler() 

parser = XMLTreeBuilder(target=handler) 

parser.feed(<sometag>) 
parser.feed(<sometag-child-tag>text) 
parser.feed(</sometag-child-tag>) 
parser.feed(</sometag>) 
parser.close() 

В этот пример обработчик получит пять событий и печати:

sometag начал

sometag-ребенок начал

"текст" чтения данных

sometag-ребенок закончился

sometag закончился

Все данные чтения

0

Вы можете использовать любой парсер SAX, подавая данные, доступные до сих пор. Используйте обработчик SAX, который просто восстанавливает исходный XML-файл, держит стек тегов открытым и закрывает их в обратном порядке в конце.

1

Если я понять ваш вопрос правильно, у вас есть файл журнала, который всегда, добавленными так что вы получите что-то вроде:

<root> 
<entry> ... </entry> 
<entry> ... </entry> 
... 
<entry> ... </entry 
<!-- no closing root --> 

В этом случае вы НЕ хотите использовать парсер DOM, потому что он пытается прочитать полный документ и задохнется от отсутствующего тега. Вместо этого анализатор SAX или Pull будет работать, поскольку он считывает документ как поток данных, а не полное дерево. Как ответил Денис выше, вы можете либо закрыть отсутствующий тег в конце, либо проигнорировать любые незавершенные теги перед его записью.

XML parsing on Wikipedia

0

Вы можете использовать BeautifulStoneSoup (XML часть BeautifulSoup).

www.crummy.com/software/BeautifulSoup

Это не идеально, но было бы обойти эту проблему, если вы не можете исправить выход файла ...

Это в основном ранее реализована версия того, что Денис сказал.

Вы можете просто присоединить все, что вам нужно, в суп, и оно сделает все возможное, чтобы исправить это.

Смежные вопросы