7

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

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

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

因此,我想对 WriteEndElement 进行检查调用,检查元素名称,并抛出异常,除非光标位于预期元素处。

xml.WriteEndElement("payload");

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

我怎样才能做到这一点?


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

4

2 回答 2

1

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

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

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

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

于 2013-05-31T07:01:00.373 回答
0

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

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

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

于 2013-05-31T10:23:47.883 回答