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

时间:2011-07-07 19:36:35

标签: 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]{}
        }
    }
}

如何解释:

  1. w-w-w +形式的所有东西都是与另一个相关的糖。链接由卷曲{显示。
  2. 4 + 1,3 + 1等表示一种糖与另一种糖上的碳键。因此,前一个碳的第四个碳链接到后一个碳的第一个碳。
  3. {}这表明没有与糖相关的额外糖
  4. }只是关闭那层。
  5. 您可以阅读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>
    

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

1 个答案:

答案 0 :(得分: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] { }   
            }
        }
    }

我认为关键在于弄清楚对是什么,并且你想要以编程方式弄清楚你在哪个级别。

伪代码:

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

你还想跟踪哪种糖是以前的“父母”糖。