Вопрос:

Необходимо изменить значение атрибута дочернего узла, найдя родительский узел в XML

python xml python-3.x elementtree

37 просмотра

2 ответа

35 Репутация автора

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

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

import xml.etree.ElementTree as ET
tree=ET.parse("EditedPT.xml")
root = tree.getroot()
for child in root:
    if child.attrib["name"] == "JobStrings":
        child.set("name","Test")
tree.write(open("EditedPT1.xml", 'w'), encoding='unicode')

XML [фиктивный XML-файл]

<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
    <Feature name="Job">
        <Option name="Use"/>
    <Feature>
    <Feature name="Job1">
        <Option name="Use"/>
    <Feature>
</Test>

Теперь мне нужно найти узел с атрибутом nameas Jobи изменить дочерний узел Option name="Use"наOption name=" working"

Автор: ashtav Источник Размещён: 10.08.2019 06:18

Ответы (2)


0 плюса

50 Репутация автора

ElementTree имеет функцию .findall (), которая будет проходить по непосредственным дочерним элементам ссылочного элемента.

for child in root.findall("./Feature/[@name="Job"]"):
    if child.findall("./Option/[@name="Use"]):
        child.set("name","working")

ссылка: https://www.datacamp.com/community/tutorials/python-xml-elementtree

Автор: Shreyash Sharma Размещён: 10.08.2019 07:03

0 плюса

3509 Репутация автора

Ниже

import xml.etree.ElementTree as ET

xmlstring = '''<?xml version="1.0" encoding="UTF-8"?>
<Test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1">
    <Feature name="Job">
        <Option name="Use"/>
    </Feature>
    <Feature name="Job1">
        <Option name="Use"/>
    </Feature>
</Test>'''


root = ET.fromstring(xmlstring)
features = root.findall('.//Feature/[@name="Job"]')
for feature in features:
    feature.find('.//Option').attrib['name'] = 'working'

tree_as_str = ET.tostring(root, encoding='utf8', method='xml')
print(tree_as_str)

выход

b'<?xml version=\'1.0\' encoding=\'utf8\'?>\n<Test version="1">\n    <Feature name="Job">\n        <Option name="working" />\n    </Feature>\n    <Feature name="Job1">\n        <Option name="Use" />\n    </Feature>\n</Test>'
Автор: balderman Размещён: 11.08.2019 08:28
Вопросы из категории :
32x32