2

目前,我正在使用 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”都有“point”元素作为子元素。但是子“点”与“点”对象不同。因此,您可能已经意识到, tempXmlDataset.ReadXmlSchema(...) 创建了一个“点”表,其中只有 x 和 y。这是根据“面积”和“线”的孩子的定义。

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

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

2 回答 2

1

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

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

如果您不从一开始就进行限制,则可能无法尝试基于 XSD 重新排序(请在 SO 中阅读此内容)...

于 2012-02-10T16:17:14.623 回答
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

于 2012-02-10T23:05:35.130 回答