读取和使用XML格式的UniProt数据库

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%数据抽取手工验证也是正确的。

因此,至少在目前的所涉及的数据范围内,这个修改应该是有效的。

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