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

时间:2015-11-19 00:36:04

标签: c# xml linq xsd

我想将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);

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

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

我考虑使用this thread中描述的GetExpectedParticles类的XmlSchemaValidator方法,但实现看起来非常复杂。

我还考虑过如下操作,在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();
}

但这似乎非常低效。

2 个答案:

答案 0 :(得分:0)

某些背景会很有用。什么是&#39; XElement&#39;?

  

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

请提供“规则”的示例&#39;你想要考虑到这一点。

答案 1 :(得分:0)

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

您的申请似乎处于不幸的位置

a)您事先并不知道XSD和

b)您需要以与XSD

一致的方式编辑XML文档

我可以问一下您的应用程序实际上在做什么(除非该信息对商业敏感 - 不要让我自己被解雇)?

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