我正在用XmlWriter编写xml。我的代码有很多这样的部分:
xml.WriteStartElement("payload");
ThirdPartyLibrary.Serialise(results, xml);
xml.WriteEndElement(); // </payload>
问题是ThirdPartyLibrary.Serialise
方法不可靠。它可能会发生(取决于变量results
)它不会关闭它打开的所有标记。因此,我的WriteEndElement行被变态,消耗了关闭库的悬挂标记,而不是写</payload>
。
因此,我想对WriteEndElement进行一次检查,检查元素名称,并抛出异常,除非游标位于期望的元素。
xml.WriteEndElement("payload");
除非光标位于文档中的预期位置,否则您可以将此视为XmlReader.ReadStartElement(name)
抛出。
我怎样才能做到这一点?
编辑:此扩展方法的第二个用例是使我自己的代码更具可读性和可靠性。
答案 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方法关闭所有打开的标签。