我有一个表示格式良好的xml文档的流。我正在尝试使用XmlReader / Writer,我只是想读取整个流并再次将其写出来。
这似乎适用于普通的终端元素:
<Context>some text</Context>
以及像这样的“短”结束元素:
<Context/>
在这些情况下,我正确地得到了一个开始和结束元素事件。
但是,如果短结束元素后面紧跟正常的结束元素:
<Item><Context/></Item>
然后我在context元素上得到一个start元素,但不是end元素!
这种简单的阅读切换和写作解释了这种奇怪的行为有什么问题?
using (XmlReader reader = XmlReader.Create(new StreamReader(GetTestXMLStream())))
using (XmlWriter writer = XmlWriter.Create(output, new XmlWriterSettings {Indent = 4}))
{
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element:
{
//Triggers for <Context/>
writer.WriteStartElement(reader.Name);
break;
}
case XmlNodeType.Text:
{
writer.WriteString(reader.Value);
break;
}
case XmlNodeType.EndElement:
{
//Triggers for <Context/>, but not if <Context/> is followed by </Item>. But does trigger for </Item> itself.
writer.WriteFullEndElement();
break;
}
}
}
}
答案 0 :(得分:0)
EndElement
后面没有空元素。因此,您需要检查IsEmptyElement以处理此类节点(文章中的部分示例):
while (reader.Read()){
if (reader.IsStartElement()){
if (reader.IsEmptyElement)
Console.WriteLine("<{0}/>", reader.Name);
else{
请注意,使用XElement
(可能使用LINQ-to-XML)或甚至XmlDocument
API通常更容易使用并拥有更多样本。除非您的XML文档是10Mb +,否则请考虑切换。