首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中删除XML元素?

如何在Python中删除XML元素?
EN

Stack Overflow用户
提问于 2019-03-02 14:37:57
回答 1查看 417关注 0票数 0

我正在尝试用ElementTree删除xml文件中的一些元素。我的代码没有给出任何错误,但它没有做我想要的事情。我想输入CHAIN_IDRES_POSITION,当我查看新编写的xml文件时,我希望看到这个残差被删除。

我的xml文件太大了,所以下面是它的一个示例:

<SEQ>
   <CHAIN>
      <CHAIN_ID>A</CHAIN_ID>
      <RESIDUE>
         <RES_POSITION>1</RES_POSITION>
         <AA_CODE>S</AA_CODE>
      </RESIDUE>
      <RESIDUE>
         <RES_POSITION>2</RES_POSITION>
         <AA_CODE>E</AA_CODE>
      </RESIDUE>
      <RESIDUE>
         <RES_POSITION>3</RES_POSITION>
         <AA_CODE>H</AA_CODE>
      </RESIDUE>

Mycode:

def deleted_residue(mychain_id, myresidue_id, file):
    mytree = ET.parse(file)
    chain = [seq for seq in mytree.findall('.//CHAIN') if seq.findtext('.//CHAIN_ID') == mychain_id]
    sequence = [res for res in mytree.findall('.//RESIDUE') if res.findtext('.//RES_POSITION') == myresidue_id]
    for seq in chain:
        for res in sequence:
            if mychain_id == "A" and myresidue_id == "2":
                seq.remove(res)
                return deleted_residue("A", "2", "pdb_one_letter.xml")

ET.tostring(SEQ, encoding='utf8').decode('utf8')
tree.write("pdb_one_letter_deleted.xml")
from xml.dom import minidom

pdbtoxml = minidom.parseString(ET.tostring(SEQ)).toprettyxml(indent="   ")
with open("pdb_one_letter_deleted.xml", "w") as pdb:
    pdb.write(pdbtoxml)
EN

回答 1

Stack Overflow用户

发布于 2019-03-05 04:30:39

您的代码有点令人困惑;尤其是列表理解部分和minidom的使用。

基于这一点:

我正在尝试用ElementTree删除

文件中的一些元素。我的代码没有给出任何错误,但它没有做我想要的事情。我想输入CHAIN_ID和RES_POSITION,当我查看新编写的xml文件时,我希望看到这个残差被删除。

我认为你可以通过在XPath predicates中进行值测试来简化...

XML Input (test.xml)

<SEQ>
   <CHAIN>
      <CHAIN_ID>A</CHAIN_ID>
      <RESIDUE>
         <RES_POSITION>1</RES_POSITION>
         <AA_CODE>S</AA_CODE>
      </RESIDUE>
      <RESIDUE>
         <RES_POSITION>2</RES_POSITION>
         <AA_CODE>E</AA_CODE>
      </RESIDUE>
      <RESIDUE>
         <RES_POSITION>3</RES_POSITION>
         <AA_CODE>H</AA_CODE>
      </RESIDUE>
   </CHAIN>
</SEQ>

Python 3.x

import xml.etree.ElementTree as ET

def deleted_residue(mychain_id, myresidue_id, file):
    tree = ET.parse(file)
    for chain in tree.findall(f".//CHAIN[CHAIN_ID='{mychain_id}']"):
        for residue in chain.findall(f"./RESIDUE[RES_POSITION='{myresidue_id}']"):
            chain.remove(residue)
    tree.write(file)

deleted_residue("A", "2", "test.xml")

XML输出(修改的test.xml)

<SEQ>
   <CHAIN>
      <CHAIN_ID>A</CHAIN_ID>
      <RESIDUE>
         <RES_POSITION>1</RES_POSITION>
         <AA_CODE>S</AA_CODE>
      </RESIDUE>
      <RESIDUE>
         <RES_POSITION>3</RES_POSITION>
         <AA_CODE>H</AA_CODE>
      </RESIDUE>
   </CHAIN>
</SEQ>

如果需要删除多个RESIDUE,在函数外部解析并传入树会更有意义。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54955900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档