如何根据 XSD 验证规则添加 XElement 子元素?

How can I add an XElement child based on XSD validation rules?

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

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

更新

我有一个 XML 文件,我根据 XSD 模式(来自第三方并且相当复杂)创建并验证了它。

将 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 class 的 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();
}

但这似乎效率低得令人难以置信。

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

But, I want the location of the child element to conform to the rules specified in a given XSD. Specifically, I want the child element to cohere to an rule. It would be nice if I could find a solution that took into account any XSD rules, though.

请举例说明您要考虑的 'rules'。

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

您的应用程序似乎处于

的不幸位置

a) 你事先不知道XSD并且

b) 您需要以与 XSD

一致的方式编辑 XML 文档

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

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