将新元素添加到遵守XSD的XmlDocument中

时间:2012-02-10 15:03:00

标签: c# .net xml xsd xsd-validation

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

有没有办法将一个元素添加到XmlDocument中,以便遵守管理我的XML文件的XSD中的序列定义?

例如,我的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文件创建了一个DataSet(名为tempXmlDataset)。我将XmlDocument的内容传递给tempXmlDataset,并且事情得到了适当的重新排序。

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

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

<rootTag>
  <point name="I define a point" x="3" y="3" otherAttributes="">
    <description>some text here</description>
  </point>
</rootTag>

2 个答案:

答案 0 :(得分:1)

由于您标记了此C#,我假设您使用的是.NET平台。 System.Xml.Schema将成为你最好的朋友。对于使用上述API生成XML的程序,还附带了可用于了解如何解决问题的源代码,我会使用XmlSampleGenerator

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

如果您从一开始就没有约束,可能无法尝试根据XSD重新订购(请在SO中阅读this)...

答案 1 :(得分:0)

使用xsd.exe根据类的xsd生成所需的代码。不要尝试为此案例创建数据集。然后,您可以将生成的代码与XmlSerializer一起使用,以生成所需的xml文件。

http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx

另见: http://msdn.microsoft.com/en-us/library/ms950721.aspx