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

时间:2013-04-04 13:53:50

标签: c# .net extension-methods xmlwriter

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

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

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

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

xml.WriteEndElement("payload");

除非光标位于文档中的预期位置,否则您可以将此视为XmlReader.ReadStartElement(name)抛出。

我怎样才能做到这一点?


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

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

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