如何使用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方法关闭任何打开的标签。