System.Xml.dll中发生'System.InvalidOperationException'

时间:2015-02-13 12:37:44

标签: c# xml visual-studio

我尝试解析以下网站的XML:PubMed

我使用以下代码来完成这项工作:

public void SearchByURI(string keyword)
{
    string URI = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=" + keyword;
    System.Xml.Serialization.XmlSerializer reader = new System.Xml.Serialization.XmlSerializer(typeof(eSearchResult));
    XmlReader xmlReader = XmlReader.Create(URI);
    eSearchResult result = new eSearchResult();
    result = (eSearchResult)reader.Deserialize(xmlReader);
}

但是当我运行代码时,它会在最后一行崩溃并出现以下异常:

  

类型' System.InvalidOperationException'的例外情况发生在System.Xml.dll中但未在用户代码中处理。附加信息:XML文档(0,0)中存在错误。

XML应该序列化的类可以在下面的pastbin中找到,这里有一点点粘贴。 PasteBin link.此代码由Visual Studio生成

1 个答案:

答案 0 :(得分:0)

所以我为解决以下问题所做的是使用XElement作为Jeroen Mostert的建议。

首先,我按照以下post中的建议创建扩展方法,如下所示:

public static XElement ToXElement<T>(this object obj)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (TextWriter streamWriter = new StreamWriter(memoryStream))
            {
                var xmlSerializer = new XmlSerializer(typeof(T));
                xmlSerializer.Serialize(streamWriter, obj);
                return XElement.Parse(Encoding.ASCII.GetString(memoryStream.ToArray()));
            }
        }
    }

    public static T FromXElement<T>(this XElement xElement)
    {
        using (var memoryStream = new MemoryStream(Encoding.ASCII.GetBytes(xElement.ToString())))
        {
            var xmlSerializer = new XmlSerializer(typeof(T));
            return (T)xmlSerializer.Deserialize(memoryStream);
        }
    }

然后我将上面的代码更改为以下代码:

 public eSearchResult SearchByURI(string keyword)
    {
        string URI = "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi?db=pubmed&term=" + keyword;
        XElement xml = XElement.Load(URI);
        eSearchResult pubMedResult = xml.FromXElement<eSearchResult>();
        return pubMedResult; 
    }