【问题标题】:How can I add an XElement child based on XSD validation rules?如何根据 XSD 验证规则添加 XElement 子项?
【发布时间】:2015-11-19 00:36:04
【问题描述】:

我想将XElement 子级添加到父级XElement 实例。但是,我希望子元素的位置符合给定 XSD 中指定的规则。具体来说,我希望子元素符合<xs:sequence> 规则。不过,如果我能找到一个考虑到任何 XSD 规则的解决方案,那就太好了。

这可能吗?我最初的想法是遍历每个已经存在的子元素并尝试在之后添加新元素,然后验证XDocument,并继续循环直到没有验证错误。但是有没有更好的方法来做到这一点?

更新

我有一个 XML 文件,我已经创建并针对 XSD 架构进行了验证(来自第 3 方并且相当复杂)。

在将 XML 文件加载为 XDocument 对象后,我的一部分代码会找到需要将新的 XElement 实例添加到父 XElement 对象的位置。在不详细介绍它的工作原理的情况下,我在这里简化了这个概念:

XDocument doc = XDocument.Load(@"path\to\file.xml");
XElement parent = GetElementToAppend(doc);
XElement newElement = new XElement("NewElement",
                          new XAttribute("RequiredAttribute", "value"));
parent.Add(newElement);

但是,我需要一种将新的XElement 插入有效位置的方法,而不是简单地使用 Add 方法。由于我要添加到完整的 XML 文档,因此父元素可能已经有许多其他子元素。因此,我需要一种方法来找到执行以下代码不会导致 XDocument 架构验证失败的第一个子元素:

XElement childElement = FindChildToAdd(parent, newElement);
childElement.AddAfterSelf(newElement);

我曾想过使用XmlSchemaValidator 类的GetExpectedParticles 方法,如this thread 中所述,但实现似乎非常复杂。

我还考虑过执行以下操作以在 XML 中找到有效位置:

foreach (XElement el in parent.Elements()) {
    bool errors = false;
    el.AddAfterSelf(newElement);
    newElement.Validate(schemas, (o, e) => { errors = true; });

    if (!errors)
        break;

    newElement.Remove();
}

但这似乎效率极低。

【问题讨论】:

    标签: c# xml linq xsd


    【解决方案1】:

    您似乎正在处理一个非常不受约束的模型。大多数 XML 应用程序能够对它们将要处理的 XML 文档的类型做出一些假设(除非它们只需要在不了解文档内容的情况下根据提供的模式进行验证)。

    您的应用程序似乎处于不幸的位置

    a) 你事先不知道 XSD 并且

    b) 您需要以与 XSD 一致的方式编辑 XML 文档

    我能问一下您的应用程序实际上想做什么(除非该信息是商业敏感信息 - 不要因为我的帐户而被解雇)?

    如果您真的需要这样做,那么我认为 GetExpectedParticles 路线是唯一的选择。但不要低估其中的复杂性 - 这是一个真正的难题,我怀疑这可能不是您真正需要解决的问题。

    【讨论】:

    • 我就是这么想的。从那以后,我决定选择尝试插入元素并循环验证的原始解决方案。它可能比使用 GetExpectedParticles 解析模式的效率略低,但我认为效率和代码复杂性之间的权衡使得这很容易。
    【解决方案2】:

    一些上下文会很有用。什么是“XElement”?

    但是,我希望子元素的位置符合给定 XSD 中指定的规则。具体来说,我希望子元素符合规则。不过,如果我能找到一个考虑到任何 XSD 规则的解决方案,那就太好了。

    请提供您要考虑的“规则”示例。

    【讨论】:

      猜你喜欢
      • 2023-01-22
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2021-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多