2014-09-15 3 views
1

У меня проблема с скриптом python, который используется для анализа XML-файла. Это файл XML:Python: метод XML-анализа

file.xml

<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe"> 
    <RandomTag>TextText</RandomTag> 
    <Tag2 xmlns="http://schemas.datacontract.org/2004/07"> 
     <AnotherRandom>Abc</AnotherRandom> 
    </Tag2> 
</Tag1> 

Я использую xml.etree.ElementTree в качестве метода синтаксического анализа. Моя задача - изменить теги между RandomTag (в данном случае «TextText»). Это код питона:

питон код

import xml.etree.ElementTree as ET 

customXmlFile = 'file.xml' 

ns = { 
'ns': 'http://www.microsoft.com/axe', 
'sc': 'http://schemas.datacontract.org/2004/07/Microsoft.Assessments.Relax.ObjectModel_V1' 
} 
tree = ET.parse(customXmlFile) 
root = tree.getroot() 
node = root.find('ns:RandomTag', namespaces=ns) 
node.text = 'NEW TEXT' 
ET.register_namespace('', 'http://www.microsoft.com/axe') 

tree.write(customXmlFile + ".new", 
xml_declaration=True, 
encoding='utf-8', 
method="xml") 

Я не бежал ошибки времени, код работает отлично, но все пространства имен определены в первом узле (Tag1) и в AnotherRandom и Tag2 используется shorcut. Кроме того, SchemaVersion удаляется.

file.xml.new - выход

<?xml version='1.0' encoding='utf-8'?> 
<Tag1 xmlns="http://www.microsoft.com/axe" xmlns:ns1="http://schemas.datacontract.org/2004/07" SchemaVersion="1.1"> 
     <RandomTag>NEW TEXT</RandomTag> 
     <ns1:Tag2> 
      <ns1:AnotherRandom>Abc</ns1:AnotherRandom> 
     </ns1:Tag2> 
</Tag1> 

file.xml.new - желаемый результат

<Tag1 SchemaVersion="1.1" xmlns="http://www.microsoft.com/axe"> 
    <RandomTag>TextText</RandomTag> 
    <Tag2 xmlns="http://schemas.datacontract.org/2004/07"> 
     <AnotherRandom>NEW TEXT</AnotherRandom> 
    </Tag2> 
</Tag1> 

Что я должен изменить, чтобы получить точный и тот же формат XML, как в beggining с в что изменился только текст?

+0

Ваш файл XML имеет некоторые проблемы, как это делает ваш код. В соответствии с вашим кодом он выводит код. Если вы можете исправить опечатки, которые помогут нам диагностировать проблему. Отправьте полный рабочий код. Например, ваш словарь ns должен использовать двоеточия и не равнозначные знаки. Также закрытие Tag1 должно иметь косую черту и т. Д. –

+0

Я исправил эти 2 проблемы. Я не могу скопировать весь код xml, потому что он большой. В основном структура такая же, как и эта, и код python, как показано в вопросе. –

+0

Я также считаю, что это должно быть пространство имен, а не пространство имен в вызове find(), уверены ли вы, что больше нет опечаток? Как насчет вашего импорта и т. Д.? Вам действительно нужно убедиться, что копия/вставка должна быть рабочим кодом. Кроме того, какую версию Python вы используете? –

ответ

0

Это немного взломанный, но будет делать то, что вы хотите. Однако игра с такими пространствами имен, безусловно, нарушает стандарт XML. Я предлагаю вам проверить lxml, если вы хотите улучшить управление пространствами имен.

Прежде чем разобрать в файле, вы должны позвонить register_namespace(). Поскольку повторные вызовы этой функции перезаписывают предыдущее сопоставление, вы должны вручную отредактировать внутренний dict.

import xml.etree.ElementTree as ET 

customXmlFile = 'test.xml' 

ns = {'ns': 'http://www.microsoft.com/axe', 
     'sc': 'http://schemas.datacontract.org/2004/07/'} 

ET.register_namespace('', 'http://www.microsoft.com/axe') 
ET._namespace_map['http://schemas.datacontract.org/2004/07'] = '' 

tree = ET.parse(customXmlFile) 
root = tree.getroot() 
node = root.find('ns:RandomTag', namespaces=ns) 
node.text = 'NEW TEXT' 

tree.write(customXmlFile + ".new", 
     xml_declaration=True, 
     encoding='utf-8', 
     method="xml") 

Для получения дополнительной информации об этом см:

http://effbot.org/zone/element-namespaces.htm

Saving XML files using ElementTree

Cannot write XML file with default namespace

+0

Благодарим вас за ответ. Я пробовал ваше решение, но результат не тот, который я хочу. На деле у меня больше нет этих shorcuts 'ns1', но все пространства имен определены в первом теге. Мне нужно точно определить, где это было. Я провел некоторое исследование в Интернете, но ничего не нашел. В конце концов, я разбирал XML-файл как текстовый файл и менял нужное значение с помощью функций, специфичных для строк. –

+0

Я понимаю, что это не совсем то, что вы хотели. Рад, что вы нашли что-то, что сработало. –