2014-09-18 1 views
0

Вот один XML документ Я работаю с:Редактирование атрибуты нескольких XML-документов

<?xml version="1.0"?> 
<document DOCID="501.conll.txt"> 
<span type="sentence"> 
    <extent> 
    <charseq START="0" END="30">ATRIA SEES H2 RESULT UP ON H1 .</charseq> 
    </extent> 
</span><span type="sentence"> 
    <extent> 
    <charseq START="205" END="310">" The result of the second year-half is expected to improve on  the early part of the year , " Atria said .</charseq> 

Я перекручивание через набор XML-документы, чтобы получить все предложения, которые начинаются с пробелом. У меня нет никаких проблем, захватив все ошибки (ведущие пробелы) с этим:

>>> import re, os, sys 
>>> import xml.etree.ElementTree as etree 
>>> sentences = {} 

>>> xmlAddresses = getListOfFilesInFolders(['XMLFiles'],ending=u'.xml') # my function to grab all XML files 

>>> for docAddr in xmlAddresses: 
>>> parser = etree.XMLParser(encoding=u'utf-8') 
>>> tree = etree.parse(docAddr, parser=parser) 
>>> sentences = getTokenTextFeature(docAddr,tree,sentences) 

>>> rgxLeadingSpace = re.compile('^\"? .') 
>>> for sent in sentences.keys(): 
>>> text = sentences[sent]['sentence'] 
>>> if rgxLeadingSpace.findall(text):  
>>>  print text      # the second sentence is from the above XML doc 

" It rallied on ideas the market was oversold , " a trader said . 

" The result of the second year-half is expected to improve on the early part of the year , " Atria said . 

" The head of state 's holiday has only just begun , " the agency quoted Sergei Yastrzhembsky as saying , adding that the president was currently in a Kremlin residence near Moscow . 

Что мне нужно сделать, это, после обнаружения ошибки, цикл через все файлы XML, которые содержат эти ошибки и корректировать свои START атрибуты. Например, это предложение из приведенного выше XML-документ, который содержал ведущее место:

<charseq START="205" END="310">" The result of the second year-half is expected to improve on  the early part of the year , " Atria said .</charseq> 

Он должен выглядеть следующим образом:

<charseq START="207" END="310">The result of the second year-half is expected to improve on  the early part of the year , " Atria said .</charseq> 

Я думаю, что я предоставил весь необходимый код. Если кто-то может мне помочь, я создам миллионные учетные записи StackOverflow и увеличу вам миллионы раз! :) Спасибо!

+0

Я использую парсер и не Soley полагаться на регулярное выражение, так что не размещать эту ссылку о разборе XML с регулярным выражением: http://stackoverflow.com/questions/1732348/regex-match-open-tags -except-xhtml-self-contains-tags – tmthyjames

ответ

1

Я не знаю, что делает getTokenTextFeature, но вот программа, которая изменяет XML в соответствии с запросами.

xml='''<?xml version="1.0"?> 
<document DOCID="501.conll.txt"> 
<span type="sentence"> 
    <extent> 
    <charseq START="0" END="30">ATRIA SEES H2 RESULT UP ON H1 .</charseq> 
    </extent> 
</span><span type="sentence"> 
    <extent> 
    <charseq START="205" END="310">" The result of the second year-half is expected to improve on  the early part of the year , " Atria said .</charseq> 
</extent></span></document> 
''' 

import re 
import xml.etree.ElementTree as etree 

root = etree.XML(xml) 
for charseq in root.findall(".//span[@type='sentence']/extent/charseq[@START]"): 
    match = re.match('^("? +)(.*)', charseq.text) 
    if match: 
    space,text = match.groups() 
    charseq.set('START', str(int(charseq.get('START')) + len(space))) 
    charseq.text = text 
print etree.tostring(root) 
+0

Спасибо! Есть ли способ сделать это, не вытесняя пространство имен из XML? Я использовал ваш метод для записи новых XML-документов без ошибок, но новые документы не имеют исходного пространства имен. – tmthyjames

+0

Это совершенно новый вопрос. Пожалуйста, подготовьте короткую автономную демонстрационную программу (например, ту, которую я вложил в ответ), и задайте новый вопрос, скопировав эту короткую программу в ваш новый вопрос. (Ответ будет: «На самом деле у них есть исходное пространство имен, а не один и тот же префикс. Но префикс не имеет значения, так или иначе».) –

+1

@tmthyjames - И если вам нужны определенные префиксы, посмотрите на [ register_namespace'] (https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.register_namespace). –

1

Подход, который я хотел бы использовать, заключался бы в том, чтобы не извлекать, а затем искать подходящие предложения в отдельном массиве, как вы это делаете, но вместо этого, пересекая узлы dom, проверяйте каждый элемент предложения на ваш шаблон. Таким образом, когда вы его найдете, вы можете напрямую использовать объект-элемент, который вы посещаете, и изменить его атрибут START, а затем просто записать измененный dom в новый (или заменяющий) XML-файл.

+0

Отличный совет! Благодаря! – tmthyjames