【问题标题】:Adding new elements to XmlDocument that abide by XSD向遵守 XSD 的 XmlDocument 添加新元素
【发布时间】:2023-03-13 11:09:01
【问题描述】:

目前,我正在使用 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 文件创建了一个数据集(名为 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>

【问题讨论】:

  • 程序运行时是否可以访问模式文档?如果是这样,BCL 提供了询问模式下一步应该做什么的方法。
  • 我在运行时有架构。 “BCL”代表什么?基类库??
  • 是的,在 System.Xml.Schema 中。具体来说,开始查看this MSDN article's 示例代码。特别注意对XmlSchemaParticle[] particles = validator.GetExpectedParticles();的调用

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    使用 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

    【讨论】:

    • 请不要发布 .NET 1.1 链接,除非问题是关于 .NET 1.1。否则,读者将陷入十年前的一系列链接中。
    猜你喜欢
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    相关资源
    最近更新 更多