用带3个命名空间的lxml修改XML文件

2024-06-28 19:01:36 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有以下XML文件。我试图更改ID标记中的文本文件。<ID>xxx</ID> 但不管我做什么,它都拒绝改变,也不给我价值。 我是个笨蛋

<ROOT xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd="w3.org/2001/XMLSchema"; xmlns:xsi="w3.org/2001/XMLSchema-instance"; xmlns="asml.com/XMLSchema/XXX/v1.0">  
<ID>Some String</ID>
<AList>
    <Attribute>
        <Name>SomeName</Name>
        <Value>SomeValue</Value>
    </Attribute>
    <Attribute>
        <Name>SomeName_2</Name>
        <Value>SomeValue_2</Value>
    </Attribute>
    <Attribute>
        <Name>SomeName_3</Name>
        <Value>SomeValue_3</Value>
    </Attribute>
</AList>
<AGroupList>
    <Group>
        <GroupKeyList>
            <Attribute>
                <Name>SomeName_4</Name>
                <Value>SomeValue_4</Value>
            </Attribute>
        </GroupKeyList>
        <GroupAList>
            <Attribute>
                <Name>SomeName_5</Name>
                <Value>SomeValue_5</Value>
            </Attribute>
        </GroupAList>
    </Group>
    <Group>
        <GroupKeyList>
            <Attribute>
                <Name>SomeName_6</Name>
                <Value>SomeValue_6</Value>
            </Attribute>
        </GroupKeyList>
        <GroupAList>
            <Attribute>
                <Name>SomeName_7</Name>
                <Value>SomeValue_7</Value>
            </Attribute>
        </GroupAList>
    </Group>
</AGroupList>

^{pr2}$

这是我的密码,我什么都试过了


Tags: nameorgidvaluegroupattributexmlschemaxsd
2条回答

主要问题是未声明的名称空间前缀xmlns="asml.com/XMLSchema/XXX/v1.0",与其他名称不同,它没有冒号分隔的标识符。这要求您使用URI限定搜索路径,如find。注意:这在XML文件中是完全有效的。在

{3和你的名称空间之间没有重复的标记。注意:这不是有效的XML。如果实际的XML <ROOT>遵循以下格式良好的版本,则以下lxml代码应该可以用来更新ID文本:

XML

<ROOT xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd2="w3.org/2001/XMLSchema"
      xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns="asml.com/XMLSchema/XXX/v1.0">  
...
</ROOT>

Python

^{pr2}$

输出

<ROOT xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsd2="w3.org/2001/XMLSchema" xmlns:xsi="w3.org/2001/XMLSchema-instance" xmlns="asml.com/XMLSchema/XXX/v1.0">  
    <ID>xxx</ID>
    <AList>
        <Attribute>
            <Name>SomeName</Name>
            <Value>SomeValue</Value>
        </Attribute>
        <Attribute>
            <Name>SomeName_2</Name>
            <Value>SomeValue_2</Value>
        </Attribute>
        <Attribute>
            <Name>SomeName_3</Name>
            <Value>SomeValue_3</Value>
        </Attribute>
    </AList>
    <AGroupList>
        <Group>
            <GroupKeyList>
                <Attribute>
                    <Name>SomeName_4</Name>
                    <Value>SomeValue_4</Value>
                </Attribute>
            </GroupKeyList>
            <GroupAList>
                <Attribute>
                    <Name>SomeName_5</Name>
                    <Value>SomeValue_5</Value>
                </Attribute>
            </GroupAList>
        </Group>
        <Group>
            <GroupKeyList>
                <Attribute>
                    <Name>SomeName_6</Name>
                    <Value>SomeValue_6</Value>
                </Attribute>
            </GroupKeyList>
            <GroupAList>
                <Attribute>
                    <Name>SomeName_7</Name>
                    <Value>SomeValue_7</Value>
                </Attribute>
            </GroupAList>
        </Group>
    </AGroupList>
</ROOT>

您的XML无效

只需在xml的末尾添加一个</ROOT>标记。那么就简单到:

from lxml import etree
xml_elem = etree.parse('path/to/file.xml')
id_elem = xml_elem.find('ID')
id_elem.text = 'xxx'

相关问题 更多 >