C# XmlSerialzier中的注释问题
我尝试用以下代码加载XML文件: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"?> <!
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”中好的,谢谢,如果我的提供商无法更改文件的原始格式,我将接受您的解决方案