2014-10-21 4 views
0

Я использую xml.etree.ElementTree для анализа и изменения файла xf utf-8. 2 проблемы связаны с тем, что файл написан в формате Unix, а не в Windows. Проблема 1 очевидна, окончание строк - \n вместо \r\n. Проблема 2 заключается в том, что строки utf-8 обрабатываются по-разному из-за разных форматов файлов (я предполагаю). Как заставить функцию write() сохранять в формате файла Windows? Я в настоящее время используют write() как:xml.etree пишет xml в файл неожиданным образом

# -*- coding: utf-8 -*- 
    import xml.etree.ElementTree as ET 
    import sys 

    altSpellingTree = ET.parse(sys.argv[2]) 
    altSpellingRoot = altSpellingTree.getroot() 
    recordList = altSpellingRoot.findall("record") # Grab all <record> elements and iterate 
    for record in recordList: 
     # Check for the existence of an <alternative_spelling> element 
     alt_spelling_node = record.find("person").find("names").find("alternative_spelling") 
     if alt_spelling_node == None: 
      continue 
     else: 
      # Check if <alternative_spelling> element text is solely "," 
      if alt_spelling_node.text == ",": 
       alt_spelling_node.text = None # Remove the lone comma 
    altSpellingTree.write(sys.argv[2], encoding="utf-8", xml_declaration=True) 

Третий вопрос заключается в том, что файл, который выводится использует самозакрывающиеся теги, где раньше было открытие и закрытие тегов (например <Country></Country> становится <Country />.). Есть ли способ избежать этого?

------- EDIT --------
Вот 2 образца, как XML выглядит, прежде чем программа запускается:

<Country></Country> 
    <Category_Type></Category_Type> 
    <Standard></Standard> 

    <names> 
     <first_name>Fernando</first_name> 
     <last_name>ROMERO AVILA</last_name> 
     <aliases> 
     <alias xsi:nil="true" /> 
     </aliases> 
     <low_quality_aliases> 
     <alias xsi:nil="true" /> 
     </low_quality_aliases> 
     <alternative_spelling>ROMERO ÁVILA,Fernando</alternative_spelling> 
    </names> 

И те же 2 образца после того, как программа запускается .:

<Country /> 
    <Category_Type /> 
    <Standard /> 

    <names> 
     <first_name>Fernando</first_name> 
     <last_name>ROMERO AVILA</last_name> 
     <aliases> 
     <alias xsi:nil="true" /> 
     </aliases> 
     <low_quality_aliases> 
     <alias xsi:nil="true" /> 
     </low_quality_aliases> 
     <alternative_spelling>ROMERO ÃVILA,Fernando</alternative_spelling> 
    </names> 
+0

Вы можете оставить часть вашего XML и вашей продукции, и что вы ожидаете увидеть? – Anzel

+0

Yup. Я получил его работу на C#, теперь я просто смущен, почему python не будет сотрудничать со мной. – Josh

+0

Одна вещь, которую я замечаю, после того, как вы разобрали 'altSpellingTree', вы никогда не меняли ее и просто« писали »в конце ... – Anzel

ответ

1

Я не проверял свой код, если есть ошибка, но, чтобы избежать самозакрывающихся тег, изменить:

altSpellingTree.write(sys.argv[2], encoding="utf-8", xml_declaration=True) 

к

altSpellingTree.write(sys.argv[2], encoding="utf-8", xml_declaration=True, method="html") 

должен сделать трюк.

И намного упростить код, вы можете использовать iter искать Ваш дерево Что-то вроде этого:

import xml.etree.ElementTree as ET 

tree = ET.parse('your.xml') 

for el in tree.iter('alternative_spelling'): 
    # check your el text or whatever 
    if el.text == u",": 
     el.text = "" 
    print el.text 
+0

Спасибо! По какой-то причине я никогда не думал добавить этот параметр. Действительно, это фиксировало проблему самозакрывающихся тегов, но остальные все еще остаются. Тем не менее, я думаю, что оба они должны делать то же самое (сохранение файла в формате Unix, а не в Windows). – Josh

+0

, когда вы пишете файл в 'utf-8', я не думаю, что формат должен быть проблемой либо в Unix/Windows. Скорее всего, то, что ** читатель xml ** вы читали и отображали сам файл xml :) – Anzel

+0

Понятно, я буду продолжать изучать это. – Josh