c# - 如何在插入/光标位置确定有效 XML 文档的架构元素?
问题描述
我从这个论坛的阅读中学到了很多东西,但是今天我需要问一个问题。
我正在开发自己的 XML Author Editor,稍后将使用它来创建 XML 文档形式的指令。我使用 AvalonEdit (C#/WPF) 作为编辑器的基础。
我已经有一个用于验证的 XML 模式。它的结构使得每个定义的元素(连同它的属性)都位于“xsd:schema”正下方的顶层(参见示例)。这些元素中的每一个都有子元素,这些子元素作为 xsd:choice 或 xsd:sequence 包含在“ref 属性”中。引用的子元素始终是上层元素。这允许元素在尊重模式的同时有效地嵌套在 XML 文档中。
我现在的问题是:假设光标<emphasis>Text Emphasis</emphasis>
位于我的 XML 文档中的元素 " " 后面。如何过滤掉架构中可以有效插入光标位置的元素?
毕竟,可能已经插入了一些允许数量的元素,因此只有某些元素可以有效插入。我的问题不仅固定在这个例子上,而且应该找到一个通用的方法。我在 XML Schema 提供的许多可能性中看到了问题:查询“complexType”、“sequence”、“minOccurs”、“maxOccurs”,包括它们的嵌套,在我看来是一项非常大且容易出错的工作。
有谁知道我可以如何进行的方法?或者有人可以指出我可以找到信息的项目或网站吗?例如,XMetal 在其付费 XML 编辑器 API 中提供了一个方法“CanInsertList”,其描述为“您可以将列出的任何元素插入当前选择”。我已经用试用版成功地测试了这个。所以一定有办法。
XML-SCHEMA
<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>
解决方案
首先非常感谢您的回答!
Michael,您建议使用 Saxon-EE 创建 SCM 文件,这给了我有用的数据,听起来非常好。在那里我也毫无疑问地相信你。
不幸的是,我还没有 Saxon-EE 版本来遵循这个。当然,如果它对我有帮助,我愿意投资这样的版本。
但是我想看一下之前编译过的 Test.scm 的一个小的 Test.xsd,看看我可以如何在它上面进行构建。是否有可能在网上的某个地方找到这样的例子,或者有人可以为我提供类似的东西吗?这肯定会很有帮助。
许多问候
推荐阅读
- matlab - Matlab Psychtoolbox fprintf 在试验中出现多个按键错误
- java - Java - 从 ResponseEntity 列表中获取一项
- java - JNI:“使用‘makefile’时目标‘HelloJNI.h’的收据失败
- python - 为什么正常使用 play() 函数会触发 menu() 中的 except 语句?
- c - 如何调试 0xc0000417 退出代码的原因
- python - 如何使用 python 从 Postgres 模式中导入所有表
- selenium - 在现有范围报告中添加新行
- java - JavaFX如何使用线程检查互联网连接
- mysql - 在 where 子句中带有 case 语句的 laravel 查询在条件后附加 IS NULL
- angular - 如何在 Ionic 3 中使用手风琴打开此表单?