2015-02-02 2 views
1

Я пытаюсь разобрать файл xml, где мне захотелось захватить строку objlocation и изменить содержимое строки.Редактировать XML с помощью python

Это есть содержимое XML-файлов, у меня есть:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<publish show="STATE"> 

    <pubgroup objtype="ELE" location="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.xml"> 

     <member objidx="15283942" objlabel="anm" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.anm"/> 

     <member objidx="15283952" objlabel="fbx" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001_M_WALK_None.fbx"/> 

     <member objidx="15283962" objlabel="mov" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mov"/> 

     <member objidx="15283972" objlabel="libraryinfo" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.json"/> 

     <member objidx="15283982" objlabel="thumbnail" objlocation="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mng"/> 

    </pubgroup> 
</publish> 

Я попытался .firstChild или .childNodes[], он печатает содержимое, как мои XML-файлов. Это список xml-файлов, которые я пытаюсь проанализировать, где его формат примерно одинаковый.

Я пытаюсь сделать это вещий способ

+1

** Как вы анализируете этот файл? Можете ли вы поделиться своим кодом, пожалуйста? Если вы используете мини-диск, знаете ли вы [предупреждение в верхней части документации] (https://docs.python.org/2/library/xml.dom.minidom.html)? Вы бы намного лучше использовали [ElementTree API] (https://docs.python.org/2/library/xml.etree.elementtree.html#module-xml.etree.ElementTree). –

+0

Я фактически использовал мини-юмор, который я убираю из онлайн-учебника. Мой плохой на этом .. – dissidia

ответ

2

Вы можете легко изменить вас г xml файл, используя ElementTree API

from xml.etree.ElementTree import parse 
doc = parse('data.xml') 
root = doc.getroot() 
for t in root.iterfind('pubgroup/member'): 
    t.attrib['objlocation'] = "spam" 

doc.write('output.xml', xml_declaration=True) 

Метод iterfind возвращает generator функция вместо list что очень удобно, если ваш есть xml файл очень большой

Выходной

<?xml version='1.0' encoding='us-ascii'?> 
<publish show="STATE"> 

    <pubgroup location="/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.xml" objtype="ELE"> 

     <member objidx="15283942" objlabel="anm" objlocation="spam" /> 

     <member objidx="15283952" objlabel="fbx" objlocation="spam" /> 

     <member objidx="15283962" objlabel="mov" objlocation="spam" /> 

     <member objidx="15283972" objlabel="libraryinfo" objlocation="spam" /> 

    <member objidx="15283982" objlabel="thumbnail" objlocation="spam" /> 

</pubgroup> 

Здесь spam есть objlocation новый товар.

+0

просто вопрос, скажем, будет возможно, если в случае, я хотел добавить/удалить/отредактировать содержимое строки? Например. ''? – dissidia

+0

@dissidia вы можете вставлять/удалять или редактировать любые теги, которые вы хотите. Возможно, вам потребуется прочитать документацию для получения дополнительной информации https://docs.python.org/3/library/xml.etree.elementtree.html#tutorial – styvane

2

Самый короткий код, который я могу предложить:

from xml.etree.ElementTree import ElementTree 
tree = ElementTree() 
root = tree.parse('test.txt') # root represents <publish> tag 

for member in root.findall('pubgroup/member'): 
    print member.attrib['objlocation'] 

Выходные:

/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.anm 
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001_M_WALK_None.fbx 
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mov 
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.json 
/user_data/STATE/ITEM/character/ANM/ANM_rig_WALK_sg_v001/ANM_rig_WALK_sg_v001.mng 

Для внесения изменений:

for member in root.findall('pubgroup/member'): 
    member.attrib['objlocation'] = 'changed' 
tree.write('output.txt') 
+0

Привет, извините за поздний ответ. Интересно, можно ли редактировать только 'objlocation'' objlabel = "libraryinfo" ', оставив остальное как есть? – yan

Смежные вопросы