У меня есть 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-файле и извлечь атрибуты я не знаю, какие модули должны быть импортированы.
Помогите.
Спасибо и всего наилучшего.
Вы можете преобразовать текст данных в словарь 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>
Ну, вы можете начать с
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
.
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")
Вот как это можно сделать, используя 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()