如何使用WriteEndElement检查元素的名称

我正在用XmlWriter编写xml。 我的代码有很多这样的部分:

xml.WriteStartElement("payload"); ThirdPartyLibrary.Serialise(results, xml); xml.WriteEndElement(); //  

问题是ThirdPartyLibrary.Serialise方法不可靠。 它可能会发生(取决于变量results )它不会关闭它打开的所有标记。 因此,我的WriteEndElement行被变态,消耗了关闭库的挂起标记,而不是写

因此,我想对WriteEndElement进行一次检查,检查元素名称,并抛出exception,除非光标位于期望的元素。

 xml.WriteEndElement("payload"); 

除非光标位于文档中的预期位置,否则您可以将其XmlReader.ReadStartElement(name)

我怎样才能做到这一点?


编辑:此扩展方法的第二个用例是使我自己的代码更具可读性和可靠性。

XMLWriter只是在流中写入给定的xml信息而不进行任何validation。 如果在编写xml标记时进行任何validation,则在创建大型xml文件时会出现性能问题。

使用XMLWriter创建XML文件取决于开发人员的风险。 如果要进行任何此类validation,可以使用XMLDocument。

如果您确实想在XMLWriter中进行此validation,则必须使用String或StringBuilder创建编写器。 因为,如果使用Stream或TextWriter,则无法读取在写入过程中写入流的信息。 在XML的每次更新中,您都必须读取字符串并编写自己的方法来validation书面信息。

我建议你使用XMLDocument来创建这些类型的xml。

最后,我编写了一个扩展方法WriteSubtree ,它提供了这个可用的API:

 using (var resultsXml = xml.WriteSubtree("Results")) { ThirdPartyLibrary.Serialise(results, resultsXml); } 

扩展方法XmlWriter.WriteSubtree类似于.NET的XmlReader.ReadSubtree 。 它返回一个特殊的XmlWriter来检查有趣的业务。 它的dispose方法关闭任何打开的标签。