如何根据特定的标签操作xml?

How to manipulate xml based on the specific tags?

提问人:LM10 提问时间:2/3/2023 更新时间:2/3/2023 访问量:51

问:

有一个 XML 是这样的

    <OUTER>
            <TYPE>FIRST</TYPE>
            <FIELD1>1</FIELD1>
            <ID>55056</ID>
            <TASK>
                <FILE>
                    <OPTIONS>1</OPTIONS>
                </FILE>
            </TASK>
    </OUTER>
    <OUTER>
                <TYPE>SECOND</TYPE>
                <FIELD1>2</FIELD1>
                <ID>58640</ID>
                <TASK>
                    <FILE>
                        <OPTIONS>1</OPTIONS>
                    </FILE>
                </TASK>
    </OUTER>

标记 ID 中的文本需要更新为新值,该值存在于此变量NEW_ID1中。比较应该发生在类型标签上,即只有当文本==FIRST时,我们才需要将ID替换为新的ID,并在type = SECOND时将其写回XML,用NEW_ID2更新ID等等,如何做到这一点?我尝试了以下方法,

tree = ET.parse("sample.xml")
root = tree.getroot()

det = tree.findall(".//OUTER[TYPE='FIRST']")
.
.
ID = NEW_ID1
tree.write("sample.xml")

但无法进一步操纵它

python-3.x xml xml 解析

评论


答:

1赞 Alexander 2/3/2023 #1

你很接近,除了不是一个属性,它是一个标签/元素,所以不会起作用。TYPE[TYPE='FIRST']

相反,您可以做的是遍历所有标签/元素,并测试它们是否包含以值为文本值的值。然后,您可以获取标签 decendant,并更改其文本值。OUTERTYPE"FIRST"OUTERID

例如:

tree = ET.parse("sample.xml")
root = tree.getroot()

for outer in tree.findall(".//OUTER"):
    elem = outer.find(".//FIRST")
    if elem.text == "FIRST":
        id_elem = outer.find(".//ID")
        id_elem.text = "NEWID1"

tree.write("sample.xml")

注意:我假设您的xml文件不仅包含您问题中的标记。xml 文件中应只有一个根元素。

评论

0赞 LM10 2/3/2023
输出结果是这样的<TYPE ID = “NEW_ID1” >FIRST</TYPE>而不是更新 <ID>tag,你能告诉我如何纠正这个问题吗?
0赞 Alexander 2/3/2023
哦。。。对不起,我误解了你的问题。我会更新
0赞 Michael Kay 2/3/2023
实际上不是一个标签。它是一个带有开始标记和结束标记的元素。使用不正确的术语会使人们很难理解文档和错误消息。TYPE
0赞 Alexander 2/3/2023
我认为两者都是......但如果它能让你开心,我会更新它@MichaelKay