解析DrugBank的XML格式数据文件

DrugBank的4.0版本目前只提供了XML格式的数据供下载,以及还提供了一个XSD格式的XML Schema文件,如何有效的解析这样格式的数据,实际上是一个不大不小的问题。其中的一个关键是,究竟如何能够从XML格式的数据文件中提取我们感兴趣的数据。

经过若干的尝试之后,似乎只有继续使用C#来编写程序能够有效的解决这一问题。然而,这个事情确实不是这样直接的。

将XSD文件转化成C#能够使用的数据类文件,这是一个我们早就讨论过的问题:

XSD.EXE /C drugbank.xsd

这样的确能够得到一个drugbank.cs文件,但是如果就此把这个文件加入一个C#的项目里面,然后用下面这个方法进行解析:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace db4
{
    public class db4
    {
        public drugs d;
        public db4(string fn)
        {
            XmlSerializer s = new XmlSerializer(typeof(drugs));
            FileStream fs = new FileStream(fn, FileMode.Open);
            XmlReader r = XmlReader.Create(fs);
            d = (drugs)s.Deserialize(r);
            r.Close();
            fs.Close();
            Console.WriteLine(d.drug.Length);
        }
    }
}

很抱歉,这根本不工作。而且,即便想我们以前处理UniProt那样进行一下修改,解决XML的数组类型转换的问题,也还是不工作。真正解决问题的办法,是要对这个XML Schema进行修改。

1.将其中420行左右开始的PropertyType的kind的枚举类型限制全部注释掉。

2.要将其中456行开始的source的枚举类型全部注释掉。

然后再重新运行XSD程序,转化经过修改的drugbank.xsd。在重新产生的drugbank.cs里面,在1621行的如下代码上修改(那个PropertyType后面的中括号)

[System.Xml.Serialization.XmlArrayItemAttribute("property", typeof(PropertyType[]), IsNullable=false)]

然后重新将drugbank.cs导入C#项目,就可以正确的对drugbank.xml进行反向序列化了。至于反向序列化后得到了drugs类型的对象之后干什么,那就是要根据具体的研究内容来进行了,这里就不再多说了。

最后提醒两点:一是,这篇blog所面向的是2014年4月14日下载的DrugBank的4.0版本的数据。如果不是相同的数据,上述办法可能不行。二是,XML的反向序列化是一个非常通用的技术,然而为什么不能直接把XML数据导入数据库,例如MySQL,仍然是一个问题。

如果有其他讨论,欢迎给我发Email。

此条目发表在生物信息学分类目录。将固定链接加入收藏夹。