目前,我正在使用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>
答案 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