Извлечение текста из отдельных элементов большого плохо отформатированного файла XML - PullRequest
1 голос
/ 10 ноября 2009

У меня большой (~ 50 МБ) файл, содержащий плохо отформатированный XML-файл, описывающий документы и свойства между тегами <item> </item>, и я хочу извлечь текст из всех документов на английском языке .

Стандартные утилиты синтаксического анализа XML Python (dom, sax, expat) подавляют неправильное форматирование, а более щадящие библиотеки (sgmllib, BeautifulSoup) анализируют весь файл и занимают слишком много времени.

<item>
  <title>some title</title>
  <author>john doe</author>
  <lang>en</lang>
  <document> .... </document>
</item>

Кто-нибудь знает способ извлечения текста между <document> </document> , только если lang=en без анализа всего документа?

Дополнительная информация: почему он "плохо отформатирован"

Некоторые документы имеют атрибут <dc:link></dc:link>, который вызывает проблемы с синтаксическими анализаторами. Xml.minidom Python жалуется:

ExpatError: unbound prefix: line 13, column 0

Ответы [ 4 ]

1 голос
/ 11 ноября 2009

если у вас есть поглазеть

gawk 'BEGIN{
 RS="</item>"
 startpat="<document>"
 endpat="</document>"
 lpat=length(startpat)
 epat=length(endpat)
}
/<lang>en<\/lang>/{
    match($0,"<document>")
    start=RSTART
    match($0,"</document>")
    end=RSTART
    print substr($0,start+lpat,end-(start+lpat)) 
}' file

выход

$ more file
Junk
Junk
<item>
  <title>some title</title>
  <author>john doe</author>
  <lang>en</lang>
  <document> text
         i want blah ............  </document>
</item>
junk
junk
<item>
  <title>some title</title>
  <author>jane doe</author>
  <lang>ch</lang>
  <document> junk text
           ..       ............ </document>
</item>
junk
blahblah..
<item>
  <title>some title</title>
  <author>GI joe</author>
  <lang>en</lang>
  <document>  text i want ..... in one line  </document>
</item>
aksfh
aslkfj
dflkas

$ ./shell.sh
 text
         i want blah ............
  text i want ..... in one line
0 голосов
/ 10 ноября 2009

В зависимости от того, как (и насколько сильно) документ «сломан», может быть возможно написать простой фильтр на perl / python, который исправит его настолько, чтобы пройти тесты правильности XML и превратить его в DOM или XSLT.

Можете ли вы добавить несколько примеров того, что не так с вводом?

0 голосов
/ 11 ноября 2009

Я думаю, что если вы в порядке с Java, VTD-XML будет работать без каких-либо проблем с этими неопределенными префиксами ...

0 голосов
/ 10 ноября 2009

Вам понадобится какой-то анализатор событий, например SAX или .NET, System.Xml.XmlReader;

...