首页 > 解决方案 > 如何在插入/光标位置确定有效 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>

标签: c#xmlxsd

解决方案


首先非常感谢您的回答!

Michael,您建议使用 Saxon-EE 创建 SCM 文件,这给了我有用的数据,听起来非常好。在那里我也毫无疑问地相信你。

不幸的是,我还没有 Saxon-EE 版本来遵循这个。当然,如果它对我有帮助,我愿意投资这样的版本。

但是我想看一下之前编译过的 Test.scm 的一个小的 Test.xsd,看看我可以如何在它上面进行构建。是否有可能在网上的某个地方找到这样的例子,或者有人可以为我提供类似的东西吗?这肯定会很有帮助。

许多问候


推荐阅读