C# System.Xml.dll中出现“System.InvalidOperationException”
我尝试解析以下网站的XML: 我正在使用以下代码来完成此工作:C# System.Xml.dll中出现“System.InvalidOperationException”,c#,xml,visual-studio,C#,Xml,Visual Studio,我尝试解析以下网站的XML: 我正在使用以下代码来完成此工作: 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.S
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.Xml.dll中发生“System.InvalidOperationException”类型的异常,但未在用户代码中处理。其他信息:XML文档0、0中存在错误
XML应该被序列化到的类可以在下面的pastbin中找到,粘贴到这里有点大。这段代码是由VisualStudio生成的,所以我解决以下问题的方法是使用Jeroen Mostert建议的XElement 首先,我创建了如下所示的扩展方法:
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;
}
XML序列化程序是一个非常复杂的问题,让它与DTD进行互操作确实非常复杂。虽然这不是对问题的直接回答,但您可能需要考虑将数据加载到XFLASE中,并将其拆开。虽然代码更多,但故障排除也更容易。好的!非常感谢,我会试试这个!那是。。。不完全是我想的,我正在考虑编写代码,手动将XElement转换为eSearchResult。这里发生的事情是,我们首先使用XElement解析XML,然后再次使其成为字符串,然后使用XmlSerializer再次解析它!但是如果这样做行得通,那就意味着直接用XmlSerializer解析它也应该行得通,而且还有其他一些微妙的问题会导致序列化程序在直接从URI读取时失败。这需要进一步研究。无论解决方案是否合适,使用Encoding.ASCII进行序列化都是一个坏主意,因为它没有涵盖Unicode的全部范围。Encoding.UTF8是个更好的主意。好的,再次感谢,我误解了你。我稍后会试试你的方法