C# 如何根据XSD验证规则添加XElement子级?
我想将C# 如何根据XSD验证规则添加XElement子级?,c#,xml,linq,xsd,C#,Xml,Linq,Xsd,我想将XElement子对象添加到父XElement实例中。但是,我希望子元素的位置符合给定XSD中指定的规则。具体地说,我希望子元素与规则保持一致。不过,如果我能找到一个考虑到任何XSD规则的解决方案,那就太好了 这可能吗?我最初的想法是循环遍历已经存在的每个子元素,然后尝试在之后添加新元素,然后验证XDocument,并在循环中继续此操作,直到没有验证错误为止。但是有没有更好的方法呢 更新 我创建了一个XML文件,并根据XSD模式进行了验证(该模式来自第三方,非常复杂) 将XML文件作为XD
XElement
子对象添加到父XElement
实例中。但是,我希望子元素的位置符合给定XSD中指定的规则。具体地说,我希望子元素与
规则保持一致。不过,如果我能找到一个考虑到任何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
类的GetExpectedParticles
方法,但实现似乎非常复杂
为了在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” 但是,我希望子元素的位置符合给定XSD中指定的规则。具体地说,我希望子元素与规则保持一致。不过,如果我能找到一个考虑到任何XSD规则的解决方案,那就太好了
请提供您想要考虑的“规则”的示例。一些上下文可能会有用。什么是“XElement” 但是,我希望子元素的位置符合给定XSD中指定的规则。具体地说,我希望子元素与规则保持一致。不过,如果我能找到一个考虑到任何XSD规则的解决方案,那就太好了
请提供您想要考虑的“规则”的示例。您似乎正在处理一个非常不受约束的模型。大多数XML应用程序能够对它们将要处理的XML文档的类型做出一些假设(除非它们只需要根据提供的模式进行验证,而不了解文档的内容) 您的应用程序似乎处于不幸的位置,其中 a) 您事先不知道XSD,并且 b) 您需要以与XSD一致的方式编辑XML文档 我可以问一下你的应用程序实际上想做什么(除非这些信息是商业敏感信息——不要因为我而被炒鱿鱼)
如果您真的需要这样做,那么我认为GetExpectedParticles路径是唯一的选择。但不要低估其中的复杂性——这是一个真正困难的问题,我怀疑这可能不是您真正需要解决的问题。您似乎正在处理一个非常不受约束的模型。大多数XML应用程序能够对它们将要处理的XML文档的类型做出一些假设(除非它们只需要根据提供的模式进行验证,而不了解文档的内容) 您的应用程序似乎处于不幸的位置,其中 a) 您事先不知道XSD,并且 b) 您需要以与XSD一致的方式编辑XML文档 我可以问一下你的应用程序实际上想做什么(除非这些信息是商业敏感信息——不要因为我而被炒鱿鱼)
如果您真的需要这样做,那么我认为GetExpectedParticles路径是唯一的选择。但不要低估其中的复杂性——这是一个真正困难的问题,我怀疑这可能不是你真正需要解决的问题。我就是这么想的。此后,我决定选择我的原始解决方案,尝试插入元素并在循环中进行验证。它可能比使用GetExpectedParticles解析模式的效率稍低,但我认为效率和代码复杂度之间的权衡使得这一点更为简单。这就是我的想法。此后,我决定选择我的原始解决方案,尝试插入元素并在循环中进行验证。它可能比使用GetExpectedParticles解析模式的效率稍低,但我认为效率和代码复杂性之间的权衡使得这一点更为简单。