仅替换fi上第一个出现的字段/单词

2024-07-02 10:04:58 发布

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

我有一些具有以下结构的zipfiles(700+)(文件就是这样)

<?xml version="1.0" encoding="UTF-8"?>
<Values version="2.0">
<record name="trigger">
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value>
    <value name="processingSuspended">false</value>
    <value name="retrievalSuspended">false</value>
</record>
<record name="trigger">
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value>
    <value name="processingSuspended">false</value>
    <value name="retrievalSuspended">false</value>
</record>
</Values>

我想实现的是,不管第一次出现的字段processingSuspendedRetrievalsSuspended的值是真还是假。将其替换为false。但只是第一次。在

编辑:

通过请求,我添加了我目前所拥有的,在那里我可以得到我想要的字段,但是。我相信有一种更简单的方法可以做到

^{pr2}$

提前谢谢。在


Tags: 文件namefalsevalueversionxmlrecord结构
2条回答

尝试使用^{}

>>> xml = '''\
<?xml version="1.0" encoding="UTF-8"?>
<Values version="2.0">
<record name="trigger">
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value>
    <value name="processingSuspended">true</value>
    <value name="retrievalSuspended">true</value>
</record>
<record name="trigger">
    <value name="uniqueId">6xjUCpDlrTVHRsEVmxx0Ews6ni8=</value>
    <value name="processingSuspended">true</value>
    <value name="retrievalSuspended">true</value>
</record>
</Values>\
'''

>>> from lxml import etree
>>> tree = etree.fromstring(xml)
>>> tree.xpath('//value[@name="processingSuspended"]')[0].text = 'false'
>>> tree.xpath('//value[@name="retrievalSuspended"]')[0].text = 'false'

这个xpath表达式'//value[@name="processingSuspended"]'查找属性name等于"processingSuspended"的所有{}标记。然后我们只取第一个带有[0]的文本,并将标记的文本改为'false'。在

输出:

^{pr2}$

您可以使用Python的内置模块读取zip归档文件并更新其中包含的xml格式的数据。在documentation中甚至有一个关于xml.etree.ElementTree的教程。在

import glob
import xml.etree.ElementTree as ET
import zipfile

def main():
    for z in glob.glob("*.zip"):
        print 'processing file: {!r}'.format(z)
        zfile = zipfile.ZipFile(z)
        for filename in zfile.namelist():
            print 'processing archive member: {!r} in {}'.format(filename, z)
            contents = zfile.open(filename).read()

            print 'Before changes:'
            print contents

            root = ET.fromstring(contents)
            if root.tag != "Values" or root.attrib["version"] != "2.0":
                print 'unsupported xml file'
                break

            if(root[0][1].tag == "value" and
               root[0][1].attrib["name"] == "processingSuspended"):
                root[0][1].text = "false"
            else:
                print 'expected "processingSuspended" value field not found'
                break

            if(root[0][2].tag == "value" and
               root[0][2].attrib["name"] == "retrievalSuspended"):
                root[0][2].text = "false"
            else:
                print 'expected "retrievalSuspended" value field not found'
                break

            print 'After changes:'
            updated_contents = ET.tostring(root)
            print updated_contents

if __name__== "__main__":
    main()

相关问题 更多 >