【发布时间】:2021-08-15 21:23:42
【问题描述】:
在这个论坛上我学到了很多东西,但是今天我需要问一个问题。
我正在开发自己的 XML Author Editor,稍后将使用它来创建 XML 文档形式的指令。我使用 AvalonEdit (C#/WPF) 作为编辑器的基础。
我已经有一个用于验证的 XML 模式。它的结构使得每个定义的元素(及其属性)都位于“xsd:schema”下的顶层(参见示例)。 这些元素中的每一个都有子元素,这些子元素作为 xsd:choice 或 xsd:sequence 包含在“ref 属性”中。引用的子元素始终是上层元素。 这允许元素在尊重架构的同时有效地嵌套在 XML 文档中。
我现在的问题是:
假设光标位于我的 XML 文档中的元素“<emphasis>Text Emphasis</emphasis>”后面。如何过滤掉架构中可以在光标位置有效插入的元素?
毕竟,可能已经插入了一些允许数量的元素,因此只能有效插入某些元素。 我的问题不仅固定在这个例子上,而且应该找到一个通用的方法。 我在 XML Schema 提供的多种可能性中看到了问题:查询“complexType”、“sequence”、“minOccurs”、“maxOccurs”,包括它们的嵌套,在我看来是一项非常大且容易出错的工作。
有谁知道我可以如何进行的方法?或者有人可以指出我可以找到信息的项目或网站吗? 例如,XMetal 在其付费 XML 编辑器 API 中提供了一个方法“CanInsertList”,其描述为“您可以将列出的任何元素插入当前选择”。我已经用试用版成功地测试了这个。所以一定有办法。
XML 架构
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="paragraph">
<xsd:complexType mixed="true">>
<xsd:sequence minOccurs="1" maxOccurs="1">
<xsd:choice minOccurs="1" maxOccurs="2">
<xsd:element ref="halfsided" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element ref="emphasis" minOccurs="0" maxOccurs="1"/>
<xsd:element ref="quotationmarks" minOccurs="0" maxOccurs="unbounded"/>
</xsd:choice>
<xsd:element ref="numericallist" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element ref="info" minOccurs="1" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="id" type="xsd:string" use="required"/>
<xsd:attribute name="creator" default="Employees1">
</xsd:complexType>
</xsd:element>
<xsd:element name="numericallist">
...
XML 文档
<section>
<paragraph id="123">Text 1
<emphasis>Text Emphasis</emphasis>
<quotationmarks>Text Quotationmarks</quotationmarks>
Text 2
</paragraph>
</section>
【问题讨论】:
-
模式对象模型应该会有所帮助,但由于 XSD 模式很复杂,因此用于导航它们的 API 也很复杂。