我尝试解析以下网站的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生成
答案 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;
}