【问题标题】:How to check name of element with WriteEndElement如何使用 WriteEndElement 检查元素名称
【发布时间】:2013-04-04 13:53:50
【问题描述】:

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

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

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

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

xml.WriteEndElement("payload");

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

我怎样才能做到这一点?


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

【问题讨论】:

  • 您能否将新的XmlWriter 发送到ThirdPartyLibrary.Serialise 并在将其添加到您的xml 对象之前对其进行明确检查?
  • 您能在将results 传递给Serialise 之前以某种方式验证它吗? (即当您传入某些类型的结果时,您能否重现序列化方法的中断)
  • @KeyboardP — 第三方库实际上是用户提供的实现接口的插件,因此不可信。

标签: c# .net extension-methods xmlwriter


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 1970-01-01
      • 2021-08-19
      相关资源
      最近更新 更多