2016-07-18 2 views
1

Я разбираю огромный XML-файл, используя код, описывающий here, и он отлично работает. Однако я понял, что в некоторых случаях отсутствует родительский элемент. Вот один пример:обрабатывать отсутствующие теги в XML, используя lxml

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE dblp SYSTEM "dblp.dtd"> 
    <dblp> 

    <article mdate="2011-01-11" key="journals/acta/Ernst77"> 
    <author>George W. Ernst</author> 
    <title>Rules of Inference for Procedure Calls.</title> 
    <journal>Acta Inf.</journal> 
    <volume>8</volume> 
    <year>1977</year> 
    <pages>145-152</pages> 
    <url>db/journals/acta/acta8.html#Ernst77</url> 
    <ee>http://dx.doi.org/10.1007/BF00289246</ee> 
    </article> 

    <article mdate="2011-01-11" key="journals/acta/Pfaff83"> 
    <author>G&uuml;nther E. Pfaff</author> 
    <title>The Construction of Operator Interfaces Based on Logical Input Devices.</title> 
    <pages>151-166</pages> 
    <year>1983</year> 
    <volume>19</volume> 
    <journal>Acta Inf.</journal> 
    <url>db/journals/acta/acta19.html#Pfaff83</url> 
    <ee>http://dx.doi.org/10.1007/BF00264473</ee> 
    </article> 
    <article mdate="2011-01-11" key="journals/acta/EngelfrietV88"> 
    <author>Joost Engelfriet</author> 
    <author>Heiko Vogler</author> 
    <title>High Level Tree Transducers and Iterated Pushdown Tree Transducers.</title> 
    <pages>131-192</pages> 
    <year>1988</year> 
    <volume>26</volume> 
    <journal>Acta Inf.</journal> 
    <number>1/2</number> 
    <url>db/journals/acta/acta26.html#EngelfrietV88</url> 
    <ee>http://dx.doi.org/10.1007/BF02915449</ee> 
    </article> 

    <author>Antonio Gull&igrave;</author> 
    <title>Clustering and ranking for web information retrieval: methodologies for searching the web.</title> 
    <year>2008</year> 
    <school>University of Pisa</school> 
    <pages>1-137</pages> 
    <isbn>978-3-8364-5657-9</isbn> 
    <ee>http://d-nb.info/987753223</ee> 

    </dblp> 

последняя запись отсутствует в начальный и конечный тег <article>.

в коде (см. Ссылку) ошибка исходит от функции extract_paper_elements в петле для обработки for event, element in context. Вот ошибка:

Element dblp content does not follow the DTD, expecting (article | inproceedings | proceedings | book | incollection | phdthesis | mastersthesis | www)*, got (article article article author title year school pages isbn ee), line 47, column 12 

Есть ли решение для таких случаев? Я был бы также рад за решение найти эти случаи (используя команды bash или код). Если количество дел не много, я могу исправить их вручную!

ответ

2

Решение такое, как вы ожидаете: вручную отремонтировать сломанный XML.

Нет общего способа ремонта, который вы можете автоматически применить при возникновении произвольной ошибки проверки. Можно представить, что некоторые простые случаи рассматриваются автоматически, но в целом может быть несколько способов решения ошибки проверки. Обычно вы решаете, какой из них подходит и вручную исправлять XML (или исправить восходящую систему, которая создала недопустимый XML).

Затем вы снова проверяете и адресуете любые дополнительные вопросы. Этот цикл повторяется до тех пор, пока не останется ошибка проверки (так же, как и ремонт синтаксических проблем на языке программирования).