【问题标题】:I have XML file I want change its element value through python. change its value if "No" changed to "NA", and other than "Yes"我有 XML 文件,我想通过 python 更改它的元素值。如果“否”更改为“NA”,则更改其值,而不是“是”
【发布时间】:2021-10-05 03:44:51
【问题描述】:

Data.xml

<?xml version='1.0' encoding='UTF-8'?>
<inno:dom xmlns:inno="http://innodatalabs.com/innodom">
    <inno:meta>
        <inno:datapoint idref="text-61">Yes</inno:datapoint>
        <inno:datapoint idref="text-64">No</inno:datapoint>
        <inno:datapoint idref="text-67">Personal Information</inno:datapoint>
        <inno:datapoint idref="text-68">Non-Personal Information</inno:datapoint>
    </inno:meta>
</inno:dom>

输出应该是这样的 Data.xml

<?xml version='1.0' encoding='UTF-8'?>
<inno:dom xmlns:inno="http://innodatalabs.com/innodom">
    <inno:meta>
        <inno:datapoint idref="text-61">Yes</inno:datapoint>
        <inno:datapoint idref="text-64">NA</inno:datapoint>
        <inno:datapoint idref="text-67">Yes</inno:datapoint>
        <inno:datapoint idref="text-68">Yes</inno:datapoint>
    </inno:meta>
</inno:dom>

*如果值为“No”,则更改为“NA”,如果值不是“Yes”或“No”,则更改为“Yes”*

【问题讨论】:

    标签: python-3.x xml


    【解决方案1】:

    您可以使用正则表达式来快速获得结果:

    import re
    
    x = """
    <?xml version='1.0' encoding='UTF-8'?>
    <inno:dom xmlns:inno="http://innodatalabs.com/innodom">
        <inno:meta>
            <inno:datapoint idref="text-61">Yes</inno:datapoint>
            <inno:datapoint idref="text-64">No</inno:datapoint>
            <inno:datapoint idref="text-67">Personal Information</inno:datapoint>
            <inno:datapoint idref="text-68">Non-Personal Information</inno:datapoint>
        </inno:meta>
    </inno:dom>
    """
    result = re.sub(r">([^<\n]+)<\/", lambda x: ">NA</" if x.group() == ">No</" else ">Yes</", x)
    print(result)
    

    但正如@mzjn 指出的那样,一般来说,使用正则表达式更改 XML 文件并不是一个好主意。

    请参阅ElementTree and how to modify XML files

    例子:

    import xml.etree.ElementTree as ET
    
    if __name__ == "__main__":
        namespace_uri = "http://innodatalabs.com/innodom"
        ET.register_namespace('inno', namespace_uri)
        tree = ET.parse('test.xml')
        root = tree.getroot()
        for child in root.iter("{{{0}}}datapoint".format(namespace_uri)):
            text = child.text
            if text == "No":
                child.text = "NA"
            else:
                child.text = "Yes"
        tree.write("output.xml")
    

    test.xml 是您的示例。

    【讨论】:

    • 使用正则表达式处理 XML 通常是个坏主意。
    • @mzjn 你是对的。这是一个快速的解决方案。要创建一个真正的流程,我会使用 ElementTree 之类的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2014-06-28
    相关资源
    最近更新 更多