Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据XSD验证规则添加XElement子级?_C#_Xml_Linq_Xsd - Fatal编程技术网

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解析模式的效率稍低,但我认为效率和代码复杂性之间的权衡使得这一点更为简单。