【发布时间】: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();
}
但这似乎效率极低。
【问题讨论】: