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。