Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Xml.dll中出现“System.InvalidOperationException”_C#_Xml_Visual Studio - Fatal编程技术网

C# System.Xml.dll中出现“System.InvalidOperationException”

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

我尝试解析以下网站的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.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是个更好的主意。好的,再次感谢,我误解了你。我稍后会试试你的方法