Редактирование текстов XML от XML-файла с помощью Python

У меня есть XML-файл, который содержит некоторые данные, как дали.

<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData>
  <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85">
- <Parameter name="Spec 2 Included" type="boolean" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 2 Label" type="string" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 3 Included" type="boolean" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
- <Parameter name="Spec 3 Label" type="string" mode="both">
  <Value>n/a</Value> 
  <Result>n/a</Result> 
  </Parameter>
  </ParameterList>
  </ParameterData>

У меня есть один текстовый файл со строками как

Spec 2 Included : TRUE
Spec 2 Label: 19-Flat2-HS3   
Spec 3 Included : FALSE
Spec 3 Label: 4-1-Bead1-HS3

Теперь я хочу отредактировать тексты XML; я, e. Я хочу заменить поле (n/a) соответствующими значениями от текстового файла. Как я хочу файл к, похож

<?xml version="1.0" encoding="UTF-8" ?> 
- <ParameterData>
  <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj" /> 
- <ParameterList count="85">
- <Parameter name="Spec 2 Included" type="boolean" mode="both">
  <Value>TRUE</Value> 
  <Result>TRUE</Result> 
  </Parameter>
- <Parameter name="Spec 2 Label" type="string" mode="both">
  <Value>19-Flat2-HS3</Value> 
  <Result>19-Flat2-HS3</Result> 
  </Parameter>
- <Parameter name="Spec 3 Included" type="boolean" mode="both">
  <Value>FALSE</Value> 
  <Result>FALSE</Result> 
  </Parameter>
- <Parameter name="Spec 3 Label" type="string" mode="both">
  <Value>4-1-Bead1-HS3</Value> 
  <Result>4-1-Bead1-HS3</Result> 
  </Parameter>
  </ParameterList>
  </ParameterData>

Я плохо знаком с этим Python-XML, кодирующим. У меня нет идеи о том, как отредактировать текстовые поля в XML-файле. Я пытаюсь Использовать elementtree. Модуль ElementTree. но считать строки в XML-файле и извлечь атрибуты я не знаю, какие модули должны быть импортированы.

Помогите.

Спасибо и всего наилучшего.

6
задан Community 5 November 2015 в 14:02
поделиться

4 ответа

Вы можете преобразовать текст данных в словарь Python с помощью регулярного выражения

data="""Spec 2 Included : TRUE
Spec 2 Label: 19-Flat2-HS3
Spec 3 Included : FALSE
Spec 3 Label: 4-1-Bead1-HS3"""

#data=open("data.txt").read()

import re

data=dict(re.findall('(Spec \d+ (?:Included|Label))\s*:\s*(\S+)',data))

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

{'Spec 3 Included': 'FALSE', 'Spec 2 Included': 'TRUE', 'Spec 3 Label': '4-1-Bead1-HS3', 'Spec 2 Label': '19-Flat2-HS3'}

Затем вы можете преобразовать используя любой из ваших любимых XML-парсеров, я буду использовать здесь minidom.

from xml.dom import minidom

dom = minidom.parseString(xml_text)
params=dom.getElementsByTagName("Parameter")
for param in params:
    name=param.getAttribute("name")
    if name in data:
        for item in param.getElementsByTagName("*"): # You may change to "Result" or "Value" only
            item.firstChild.replaceWholeText(data[name])

print dom.toxml()

#write to file
open("output.xml","wb").write(dom.toxml())

Results

<?xml version="1.0" ?><ParameterData>
  <CreationInfo date="10/28/2009 03:05:14 PM" user="manoj"/>
  <ParameterList count="85">
    <Parameter mode="both" name="Spec 2 Included" type="boolean">
      <Value>TRUE</Value>
      <Result>TRUE</Result>
    </Parameter>
    <Parameter mode="both" name="Spec 2 Label" type="string">
      <Value>19-Flat2-HS3</Value>
      <Result>19-Flat2-HS3</Result>
    </Parameter>
    <Parameter mode="both" name="Spec 3 Included" type="boolean">
      <Value>FALSE</Value>
      <Result>FALSE</Result>
    </Parameter>
    <Parameter mode="both" name="Spec 3 Label" type="string">
      <Value>4-1-Bead1-HS3</Value>
      <Result>4-1-Bead1-HS3</Result>
    </Parameter>
  </ParameterList>
</ParameterData>
6
ответ дан 8 December 2019 в 18:37
поделиться

Ну, вы можете начать с

import xml.etree.ElementTree as ET
tree = ET.parse("blah.xml")

Найдите элементы , которые вы хотите изменить.

Чтобы заменить содержимое элемента, просто выполните

element.text = "TRUE"

Оператор импорта выше работает в Python 2.5 или новее. Если у вас более старая версия Python, вам необходимо установить ElementTree как расширение, а затем оператор импорта будет другим: import elementtree.ElementTree as ET .

вы можете начать с

import xml.etree.ElementTree as ET
tree = ET.parse("blah.xml")

Найдите элементы , которые вы хотите изменить.

Чтобы заменить содержимое элемента, просто выполните

element.text = "TRUE"

Оператор импорта выше работает в Python 2.5 или новее. Если у вас более старая версия Python, вам необходимо установить ElementTree как расширение, а затем оператор импорта будет другим: import elementtree.ElementTree as ET .

вы можете начать с

import xml.etree.ElementTree as ET
tree = ET.parse("blah.xml")

Найдите элементы , которые вы хотите изменить.

Чтобы заменить содержимое элемента, просто выполните

element.text = "TRUE"

Оператор импорта выше работает в Python 2.5 или новее. Если у вас более старая версия Python, вам необходимо установить ElementTree как расширение, а затем оператор импорта будет другим: import elementtree.ElementTree as ET .

5
ответ дан 8 December 2019 в 18:37
поделиться

Unfortunately, the XPath supported by ElementTree isn't complete. Since Python 2.6 includes an older version, finding elements by attribute (as stated here) does not work. So Python's own documentation should be your first stop: xml.etree.ElementTree

import xml.etree.ElementTree as ET

original = ET.parse("original.xml")
parameters = original.findall(".//Parameter")
changes = {}

# read changes
with open("changes.txt", "rb") as in_file:
    for change in in_file:
        change = change.rstrip()                # remove line endings
        name, value = change.split(":")
        changes[name.strip()] = value.strip()   # remove whitespaces

# find paramter element and apply changes
for parameter in parameters:
    parameter_name = parameter.get("name")
    if changes.has_key(parameter_name):                
        value = parameter.find("./Value")
        value.text = changes[parameter_name]
        result = parameter.find("./Result")
        result.text = changes[parameter_name]

original.write("new.xml")
1
ответ дан 8 December 2019 в 18:37
поделиться

Вот как это можно сделать, используя Amara

from amara import bindery

doc = bindery.parse(XML)

def cleanup_for_dict(key, value):
    return key.strip(), value.strip()

params = dict(( cleanup_for_dict(*line.split(':', 1))
                for line in TEXT.splitlines()))

for param in doc.ParameterData.ParameterList.Parameter:
    if param.name in params:
        param.Value = params[param.name]
        param.Result = params[param.name]

doc.xml_write()
1
ответ дан 8 December 2019 в 18:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: