如何根据 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 路由是唯一的选择。但是不要低估其中涉及的复杂性 - 这是一个真正困难的问题,我怀疑这可能不是您 真正 需要解决的问题。
我想向父 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 路由是唯一的选择。但是不要低估其中涉及的复杂性 - 这是一个真正困难的问题,我怀疑这可能不是您 真正 需要解决的问题。