C# XmlSerialzier中的注释问题

C# XmlSerialzier中的注释问题,c#,.net-4.0,xmlserializer,xml-comments,C#,.net 4.0,Xmlserializer,Xml Comments,我尝试用以下代码加载XML文件: XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject)); StreamReader reader = new StreamReader(fileName); object myobject = xmlSerializer.Deserialize(reader); 当文件包含如下注释时: <?xml version="1.0" encoding="utf-8"?> <!

我尝试用以下代码加载XML文件:

XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyObject));
StreamReader reader = new StreamReader(fileName);
object myobject = xmlSerializer.Deserialize(reader);
当文件包含如下注释时:

<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2007 sp2  -->
<route>
    <!--File created on 26-Nov-2010 12:36:42-->
    <file_content>1
    <!--0 = type1 ; 1 = type2-->
    </file_content>
</route>

1.
XmlSerializer返回如下错误

意外的节点类型注释。ReadElementString方法只能在内容简单或为空的元素上调用

当我在文件中删除此注释时,工作正常


我不知道问题出在哪里,有什么想法吗?

正如您所见,序列化XML中不允许使用注释,但这应该不会给您带来任何问题。您可能无法控制源XML,但可以控制反序列化过程,因此只需在反序列化之前删除所有注释即可:

    XmlSerializer xmlSerializer = new XmlSerializer(typeof(myobject));

    // load document
    XmlDocument doc = new XmlDocument();
    doc.Load(filename);

    // remove all comments
    XmlNodeList l = doc.SelectNodes("//comment()");
    foreach (XmlNode node in l) node.ParentNode.RemoveChild(node);

    // store to memory stream and rewind
    MemoryStream ms = new MemoryStream();
    doc.Save(ms);
    ms.Seek(0, SeekOrigin.Begin);

    // deserialize using clean xml
    xmlSerializer.Deserialize(XmlReader.Create(ms));

如果您的对象很大,并且在短时间内反序列化了大量对象,那么我们可以研究一些框架外快速Xpath读取器

我同意@mmix,在尝试序列化之前,您必须删除注释

删除注释的另一种方法可能是将
XmlReader
XmlReaderSettings

    public static T DeSerialize<T>(string filePath)
    {
        var x = new XmlSerializer(typeof (T));

        //Serilaize would fail if there are comments in the xml document
        var xmlReaderSettings = new XmlReaderSettings {IgnoreComments = true};
        var xmlReader = XmlReader.Create(filePath, xmlReaderSettings);

        return (T)x.Deserialize(xmlReader);
    }
publicstatict反序列化(字符串文件路径)
{
var x=新的XmlSerializer(typeof(T));
//如果xml文档中有注释,Serialize将失败
var xmlReaderSettings=newxmlreadersettings{IgnoreComments=true};
var xmlReader=xmlReader.Create(文件路径,xmlReaderSettings);
返回(T)x.反序列化(xmlReader);
}

我发现雅各布·阿洛伊修斯是这个问题最优雅的答案。当使用
System.ServiceModel.SyndicationFeed.Load
函数读取RSS提要时,它也可以工作。示例如下:

public SyndicationFeed GetFeed(String url)
{
    var request = (HttpWebRequest)WebRequest.Create(url);
    using (var response = request.GetResponse())
    using (var responseStream = response.GetResponseStream())
    {
        Debug.Assert(responseStream != null, "responseStream != null");

        var xmlReaderSettings = new XmlReaderSettings { IgnoreComments = true };
        using (XmlReader xmlReader = XmlReader.Create(responseStream, xmlReaderSettings))
        {
            var feed = SyndicationFeed.Load(xmlReader);
            return feed;
        }
    }
}

您可以尝试将注释放在元素中吗?我认为xml解析器需要将第一个节点作为根元素抱歉,但我还没有决定文件格式,它来自一个提供者,我试图在不改变其格式的情况下进行解析。无论如何,我认为问题出在第5行:“1”可能是因为注释在元素“file\u content”中好的,谢谢,如果我的提供商无法更改文件的原始格式,我将接受您的解决方案