c# - 向遵守 XSD 的 XmlDocument 添加新元素

标签 c# .net xml xsd xsd-validation

目前,我正在使用 XPath 表示法向我的 XmlDocument 添加元素,为此我编写了代码,将元素放置在文件中的正确位置。除了一个异常(exception)。我不知道如何让它注意我的 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。这是“区域”和“线”的 child 的定义。

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

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

最佳答案

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

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

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

关于c# - 向遵守 XSD 的 XmlDocument 添加新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9229769/

相关文章:

c# - 使用 OpenID 进行网站认证

c# - 将 xml 与 ApprovalTests 进行比较时忽略属性的顺序

c# - 反序列化错误

c# - UWP MediaCapture 拒绝访问相机

c# - 自定义属性 - 为枚举获取 "not a valid named attribute argument"

Java .Net 互操作。 Axis java.util.Map

c# - 如何为 VBA.GetObject 向 COM 公开正在运行的 .NET 应用程序对象? (不重复)

c# - 当存在 BOM 时,反序列化 UTF-8 编码的 XML 失败

c# - 在启用 VirtualMode 的情况下在 ListView 中聚焦一个项目

c# - 从委托(delegate)构造委托(delegate)。新的委托(delegate)指向什么?