UniProt数据库是国际公用蛋白质序列和注释数据库,可免费下载全文使用。数据库提供了Flat Text,XML和RDF三种格式供选择,我在目前的研究中,用了XML格式的数据库。要读取这个XML格式的数据库需要一点点技巧。
首先,我们有XSD文件用来定义XML的 Data Schema,这个文件可以直接下载得到uniprot.xsd。有了这个文件之后,可以直接采用MS Platform SDK中的xsd.exe来生成一个类,用以执行从XML反序列化时的类型化过程。
XSD.EXE /C uniprot.xsd
就可以得到uniprot.cs这个文件了。将这个文件包含到一个C#项目中,并使用XML反序列化进行相应的XML数据文件读取。XML文件应该是从UniProtKB中采用查询方式获得的数据片段。读取XML的代码如下:
using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Xml; using System.Xml.Serialization; namespace ParseUniProtXML { class Program { static void Main(string[] args) { XmlSerializer s = new XmlSerializer(typeof(uniprot)); FileStream fs = new FileStream(args[0],FileMode.Open); XmlReader r = new XmlTextReader(fs); uniprot UniProt = (uniprot) s.Deserialize(r); ...
但是,这个时候几乎一定会出错,会反映
未处理 System.InvalidOperationException Message=" 无法生成临时类(result=1)。rnerror CS0030: 无法将类型“geneNameType[]”转换为“geneNameType”rnerror CS0029: 无法将类型“geneNameType”隐式转换为“geneNameType[]”rn" Source="System.Xml" StackTrace: 在 System.Xml.Serialization.Compiler.Compile(Assembly parent, String ns, XmlSerializerCompilerParameters xmlParameters, Evidence evidence) 在 System.Xml.Serialization.TempAssembly.GenerateAssembly(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, Evidence evidence, XmlSerializerCompilerParameters parameters, Assembly assembly, Hashtable assemblies) 在 System.Xml.Serialization.TempAssembly..ctor(XmlMapping[] xmlMappings, Type[] types, String defaultNamespace, String location, Evidence evidence) 在 System.Xml.Serialization.XmlSerializer.GenerateTempAssembly(XmlMapping xmlMapping, Type type, String defaultNamespace) 在 System.Xml.Serialization.XmlSerializer..ctor(Type type, String defaultNamespace) 在 System.Xml.Serialization.XmlSerializer..ctor(Type type) 在 ParseUniProtXML.Program.Main(String[] args) 在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart() InnerException:
造成这个问题的原因是uniprot.xsd不是按照xsd.exe所遵守的标准编写的,由此生成的uniprot.cs不能直接使用,需要改一个地方:
在
[System.Xml.Serialization.XmlArrayItemAttribute("name", typeof(geneNameType), IsNullable=false)]
这一行中进行修改
[System.Xml.Serialization.XmlArrayItemAttribute("name", typeof(geneNameType[]), IsNullable=false)]
一个中括号后缀,就可以解决问题了。
至于这样的修改是不是能够解决所有的问题,并且是否会引起其他的变化,现在还不知道。
但是,在Uniprot数据库的全部数据上进行读取和解析测试是全部成功的,1%数据抽取手工验证也是正确的。
因此,至少在目前的所涉及的数据范围内,这个修改应该是有效的。