【问题标题】:find one line in XML file and replace the next line with some other content using python在 XML 文件中找到一行并使用 python 将下一行替换为其他内容
【发布时间】:2019-06-29 08:12:27
【问题描述】:

使用python我需要在上面的行匹配时替换XML文件中的行。

    <groupId>test</groupId>
    <artifactId>dmrfolder</artifactId>
    <version>1.0</version>

这里我想搜索dmrfolder,如果找到了,我需要将下面的1.0 替换为somevalue

我按照以下方式进行操作,但它对我不起作用。

with open('test.xml', 'r') as file :
            data = file.read()
            fnl = data.replace(line[1], str)
            with open('test.xml', 'w') as fw:
               fw.write(fnl)
               fw.close()

预期的结果是

    <groupId>test</groupId>
    <artifactId>dmrfolder</artifactId>
    <version>somevalue</version>

【问题讨论】:

  • 看一下lxml
  • XML 不是基于行的格式 - 您可以从 sn-p 中删除所有换行符,它同样有效并且包含 完全 相同的信息。 IOW:您要替换的不是“线”,而是元素节点(nlp.stanford.edu/IR-book/html/htmledition/…)。答案是:使用适当的 XML 解析器(DOM 或 SAX,取决于您的源 XML 大小等)。
  • 尝试使用xmltodict。你可以读取一个文件,将其转换为 dict,更改值,然后将 de dict 重写为 xml 文件:gis.stackexchange.com/questions/202978/…
  • 我是 python 新手。所以如果你能发布一个类似的示例代码会很有帮助。

标签: python shell search replace


【解决方案1】:

如果数据文件格式与发布的完全一致(包括间距),您可以使用.replace()

        fnl = data.replace('''dmrfolder</artifactId>
    <version>1.0''', '''dmrfolder</artifactId>
    <version>somevalue''')

对于变量或者不知名的格式,可以使用re.sub()

        fnl = re.sub('(dmrfolder</artifactId>\s*<version>)1.0', r'\1somevalue', data)
  • \s - 任何空白字符,包括 \n
  • \1 - 第一个(这里:唯一的)括号组

【讨论】:

    【解决方案2】:

    您可以使用lxmlgetnext() 来修改每个artifactId 元素的直接兄弟的值,方法如下:

    import lxml.etree
    
    xml = """
    <xml>
      <groupId>test</groupId>
      <artifactId>dmrfolder</artifactId>
      <version>1.0</version>
    </xml>
    """
    
    root = lxml.etree.fromstring(xml)
    for e in root.findall("artifactId"):
        e.getnext().text = "somevalue"
    
    print(lxml.etree.tostring(root, encoding="unicode"))
    

    结果:

    <xml>
      <groupId>test</groupId>
      <artifactId>dmrfolder</artifactId>
      <version>somevalue</version>
    </xml>
    

    【讨论】:

    • 这里我需要从 xml 文件中读取内容,因为这个 xml 文件非常大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 2021-03-24
    • 2014-08-27
    • 1970-01-01
    相关资源
    最近更新 更多