当我使用XmlTextReader反序列化XML文档时,只会忽略没有相应类的文本元素。
注意:这是不关于XML中缺少的元素,需要存在哪些元素,而是存在于XML文本中,而没有相应的元素代码中的财产。
我本来希望得到一个例外,因为如果运行时数据中缺少相应的元素并且我稍后将其序列化,则生成的XML文档将与原始XML文档不同。因此忽略它是不安全的(在我的实际案例中,我只是忘记定义给定文档包含的99个以上类中的一个,并且我最初没有注意到。)
这是正常的,如果是,为什么?如果元素无法序列化,我可以以某种方式请求我想获得异常吗?
在下面的示例-XML中,我故意拼写错误" MyComandElement"说明核心问题:
<MyRootElement>
<MyComandElement/>
</MyRootElement>
MyRootElement.cs:
public class CommandElement {};
public class MyRootElement
{
public CommandElement MyCommandElement {get; set;}
}
反序列化:
XmlSerializer xmlSerializer = new XmlSerializer(typeof(MyRootElement));
XmlTextReader xmlReader = new XmlTextReader(@"pgtest.xml");
MyRootElement mbs2 = (MyRootElement)xmlSerializer.Deserialize(xmlReader);
xmlReader.Close();
答案 0 :(得分:4)
正如我在进一步研究中偶然发现的那样,这个问题实际上很容易解决,因为......
... XmlSerializer支持事件!所有人必须做的是为缺少的元素定义一个事件处理程序
void Serializer_UnknownElement(object sender, XmlElementEventArgs e)
{
throw new Exception("Unknown element "+e.Element.Name+" found in "
+e.ObjectBeingDeserialized.ToString()+" in line "
+e.LineNumber+" at position "+e.LinePosition);
}
并使用XmlSerializer注册事件:
xmlSerializer.UnknownElement += Serializer_UnknownElement;
该主题在MSDN处理,其中一个人也了解
默认情况下,在调用Deserialize方法后,XmlSerializer会忽略未知类型的XML属性。
毫不奇怪,还有缺少属性,节点和对象的事件。
答案 1 :(得分:2)
这是正常的,如果是,为什么?
因为你可能正在使用别人的XML文档,虽然他们在XML中定义了300个不同的元素,但你只关心两个。您是否应该被迫为所有元素创建类并反序列化所有元素只是为了能够访问您关心的两个元素?
或许你正在使用一个随时间变化的系统。您正在编写消耗当前XML的代码,如果稍后引入新的元素/属性,它们不应该阻止您测试和部署的代码继续使用他们理解的那些XML部分(在此插入警告, ,希望如果您处于这种情况,那么您/ XML作者不会在以后介绍元素,这对于理解正确处理文档至关重要。)
如果系统遇到要求反序列化的XML文档中的意外部分,系统可能希望系统不会爆炸,这就是同一个硬币的两面。