从纯文本中提取信息并使用DOM写入XML

ark*_*tra 5 python xml dom bioinformatics

目前,我正在设计糖生物学领域的一些格式转换工具.格式转换涉及从文本文件转到字段中标准的XML文件.大多数情况下,我们获得的数据包含下面的纯文本文件中感兴趣的信息.实际文件在一行中包含所有这些内容.读取和拆分此文本以获取信息是微不足道的(可能不直观),但XML是问题所在.

[][b-D-GlcpNAc]
    {[(4+1)][b-D-GlcpNAc]
        {[(4+1)][b-D-Manp]
            {[(3+1)][a-D-Manp]
                {[(2+1)][a-D-Manp]{}
            }
        [(6+1)][a-D-Manp]
            {[(3+1)][a-D-Manp]{}
            [(6+1)][a-D-Manp]{}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何解释这个:

  1. ww-w +形式的所有东西都是与另一个相连的糖.链接由卷曲{显示.
  2. 4 + 1,3 + 1等表示一种糖与另一种糖上的碳键.因此,前一个碳的第四个碳链接到后一个碳的第一个碳.
  3. {}这表明没有与糖相关的额外糖
  4. curlies刚关闭那一层.

您可以阅读XML并了解链接的工作原理.但如果你们想要更详细的解释,那就问问吧.

XML的外观如下所示.

<?xml version="1.0" encoding="UTF-8"?>
<GlydeII>
    <molecule subtype="glycan" id="From_GlycoCT_Translation">
            <residue subtype="base_type" partid="1" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=b-dglc-HEX-1:5" />
            <residue subtype="substituent" partid="2" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=n-acetyl" />
            <residue subtype="base_type" partid="3" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=b-dglc-HEX-1:5" />
            <residue subtype="substituent" partid="4" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=n-acetyl" />
            <residue subtype="base_type" partid="5" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=b-dman-HEX-1:5" />
            <residue subtype="base_type" partid="6" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=a-dman-HEX-1:5" />
            <residue subtype="base_type" partid="7" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=a-dman-HEX-1:5" />
            <residue subtype="base_type" partid="8" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=a-dman-HEX-1:5" />
            <residue subtype="base_type" partid="9" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=a-dman-HEX-1:5" />
            <residue subtype="base_type" partid="10" ref="http://www.monosaccharideDB.org/GLYDE-II.jsp?G=a-dman-HEX-1:5" />
            <residue_link from="2" to="1">
                <atom_link from="N1H" to="C2" to_replace="O2" bond_order="1" />
            </residue_link>
            <residue_link from="3" to="1">
                <atom_link from="C1" to="O4" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="4" to="3">
                <atom_link from="N1H" to="C2" to_replace="O2" bond_order="1" />
            </residue_link>
            <residue_link from="5" to="3">
                <atom_link from="C1" to="O4" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="6" to="5">
                <atom_link from="C1" to="O3" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="7" to="6">
                <atom_link from="C1" to="O2" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="8" to="5">
                <atom_link from="C1" to="O6" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="9" to="8">
                <atom_link from="C1" to="O3" from_replace="O1" bond_order="1" />
            </residue_link>
            <residue_link from="10" to="8">
                <atom_link from="C1" to="O6" from_replace="O1" bond_order="1" />
            </residue_link>
    </molecule>
</GlydeII>
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经能够轻松获取所有残留字段并将其写入XML.但是我甚至无法为残余连接字段编写伪代码.即使我可以获得有关如何在xml中添加链接信息的帮助和想法,我也会很感激.

Civ*_*ian 1

好的!很酷的问题,它以一种很好的方式伤害了我的大脑。

首先......为了我的理智,我将您的原始数据标记为有意义的方式:

[][b-D-GlcpNAc] {
    [(4+1)][b-D-GlcpNAc] {
        [(4+1)][b-D-Manp] {
            [(3+1)][a-D-Manp] {
                [(2+1)][a-D-Manp] { }
            }
            [(6+1)][a-D-Manp] {
                [(3+1)][a-D-Manp] { }
                [(6+1)][a-D-Manp] { }   
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我认为关键是弄清楚配对是什么,并且您想以编程方式找出您所处的级别。

伪代码:

hierarchy = 0
nextChar = getNextChar()
while (Parsing):
    if (nextChar = "{"):
        hierarchy += 1
    elif (nextChar = "}"):
        hierarchy -= 1
    if (nextChar = "["):
        storeSugar(hierarchy)
Run Code Online (Sandbox Code Playgroud)

您还需要跟踪哪个糖是先前的“父”糖。