我想将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();
}
但这似乎非常低效。
答案 0 :(得分:0)
某些背景会很有用。什么是&#39; XElement&#39;?
但是,我希望子元素的位置符合给定XSD中指定的规则。具体来说,我希望子元素符合规则。不过,如果我找到一个考虑到任何XSD规则的解决方案,那就太好了。
请提供“规则”的示例&#39;你想要考虑到这一点。
答案 1 :(得分:0)
你似乎正在处理一个非常不受约束的模型。大多数XML应用程序能够对它们将要处理的XML文档类型做出一些假设(除非它们只需要根据提供的模式进行验证而不了解文档的内容)。
您的申请似乎处于不幸的位置
a)您事先并不知道XSD和
b)您需要以与XSD
一致的方式编辑XML文档我可以问一下您的应用程序实际上在做什么(除非该信息对商业敏感 - 不要让我自己被解雇)?
如果你真的需要这样做,那么我认为GetExpectedParticles路线是唯一的选择。但是不要低估其中涉及的复杂性 - 这是一个真正难以解决的问题,我怀疑它可能不是你真正需要解决的问题。