Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 向XmlDocument中添加遵守XSD的新元素_C#_.net_Xml_Xsd_Xsd Validation - Fatal编程技术网

C# 向XmlDocument中添加遵守XSD的新元素

C# 向XmlDocument中添加遵守XSD的新元素,c#,.net,xml,xsd,xsd-validation,C#,.net,Xml,Xsd,Xsd Validation,目前,我正在使用XPath表示法将元素添加到XmlDocument中,我已经为XPath表示法编写了代码,将元素放置在文件中的正确位置。只有一个例外。我不知道如何让它注意我的XSD文件中定义的序列规则 有没有一种方法可以将元素添加到XmlDocument中,以使其遵守XSD中定义的序列,该序列管理XML文件 例如,我的xml文档应该如下所示: <rootTag> <area name="I define an area"> <description>

目前,我正在使用XPath表示法将元素添加到XmlDocument中,我已经为XPath表示法编写了代码,将元素放置在文件中的正确位置。只有一个例外。我不知道如何让它注意我的XSD文件中定义的序列规则

有没有一种方法可以将元素添加到XmlDocument中,以使其遵守XSD中定义的序列,该序列管理XML文件

例如,我的xml文档应该如下所示:

<rootTag>
  <area name="I define an area">
    <description>some text here</description>
    <point x="1" y="1" />
    <point x="2" y="2" />
    <point x="3" y="3" />
  </area>
</rootTag>

这里有一些文字
然而,根据用户为上面的子标记输入值的顺序,我得到:

<rootTag>
  <area name="I define an area">
    <point x="1" y="1" />
    <point x="2" y="2" />
    <point x="3" y="3" />
    <description>some text here</description>
  </area>
</rootTag>

这里有一些文字
为了纠正上述问题,我从XSD文件创建了一个数据集(名为tempXmlDataset)。我将XmlDocument的内容传递到tempXmlDataset,然后适当地重新排序

但是,我的问题是由XML文档的第一个子项的选项引起的。该选项在XSD中定义为允许“区域”、“线”或“点”对象。“区域”和“线”都有“点”元素作为子元素。但子“点”与“点”对象不同。因此,正如您可能已经意识到的,tempXmlDataset.ReadXmlSchema(…)创建了一个“点”表,其中只有x和y。这是根据儿童对“面积”和“线”的定义

因此,当我的代码运行tempXmlDataset.ReadXml(…)时,“point”对象的属性不会被读入,因为它将“point”对象视为子“point”。以下是“点”对象的示例:


这里有一些文字
既然您标记了这个C#,我假设您在.NET平台上。他会是你最好的朋友。对于一个使用上述API生成XML的程序,它还附带了可以用来理解如何解决问题的源代码,我将使用

生成示例XML需要的正是约束用户在给定时间点输入的XPath所需的内容。我相信您必须从一开始就根据您在编辑过程中所处的位置来限制允许的XPath,否则,一个错误可能会使整个方法变得无用


如果不从一开始就进行约束,可能无法尝试基于XSD重新排序(请在SO中阅读).

使用XSD.exe为类生成基于XSD的所需代码。不要尝试为这种情况创建数据集。然后,您可以将生成的代码与XmlSerializer一起使用,以生成所需的xml文件

另见:

程序运行时,您是否有权访问架构文档?如果是这样,BCL提供了询问模式下一步应该做什么的方法。“BCL”代表什么?基类库??是的,在System.Xml.Schema中。具体来说,开始看示例代码。特别注意对
XmlSchemaParticle[]particles=validator.GetExpectedParticles()的调用。。。请不要发布.NET1.1链接,除非问题是关于.NET1.1的。否则,读者将陷入十年前的一系列链接中。
<rootTag>
  <point name="I define a point" x="3" y="3" otherAttributes="">
    <description>some text here</description>
  </point>
</rootTag>