Xml序列化 - 读取结束元素标记?

时间:2009-07-17 12:12:45

标签: c# xml-serialization

我最近在MSDN上阅读了IXmlSerializable接口信息,对整个结束标记事情有点困惑。

据我了解,如果您正在实现IXmlSerializable,那么您不需要编写结束标记,但是您需要阅读它吗?例如。如果我的A类没有读取结束标记

,则会出现以下错误
<A>
   <i>32</i>
</A>

但是如果内容是

会发生什么
<A i="32"/>

如果我尝试在此处读取结束标记,则会出现InvalidOperationException。但是,如果我继续读下去,确定我应该阅读的内容是不是会影响读者的位置呢?

我想我只是稍微迷失了,因为当我必须处理IXmlSerializable孩子(可以是不同类型的)和IXmlSerializable元素的集合时,我正在处理的代码变得更复杂一些。

3 个答案:

答案 0 :(得分:2)

我在回忆XmlReader.IsEmptyElement。如果设置了开始标记,那么您有<a />。如果未设置,则您有<a></a>。后者你读了结束标记,前者你没有。

答案 1 :(得分:1)

XmlReaderXPathNavigator都会实现名为IsEmptyElement的属性。

来自文档:

  

在派生类中重写时,获取一个值,该值指示当前节点是否为没有结束元素标记的空元素。

因此,当您看到一个start-element事件时,如果IsEmptyElementtrue,则不应该查找end-element事件。对于那种情况,start-element事件既作为开始也是结束。

答案 2 :(得分:-1)

我认为关于不读取结束标记的这一点是针对您的对象嵌入更大结构的情况:

public class Wrapper {
    public A Wrapped;
}

<Wrapper>
    <Wrapped><i>32</i></Wrapped>
</Wrapper>

我希望您需要阅读<Wrapped></Wrapped>,而不是</Wrapper>

相关问题