【问题标题】:How do I determine the schema elements for a valid XML document at the insert/cursor position?如何在插入/光标位置确定有效 XML 文档的架构元素?
【发布时间】: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 也很复杂。

标签: c# xml xsd


【解决方案1】:

您需要访问架构的编译形式。例如,如果您使用 Saxon-EE 编译模式,则可以导出包含编译模式的 SCM 文件,其中包括用于验证复杂类型的有限状态自动机的 XML 表示。使用 FSA,您可以确定来自任何给定状态的有效转换,并且可以将其用于模式感知编辑。

【讨论】:

    【解决方案2】:

    首先非常感谢您的回答!

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

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

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

    许多问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-25
      • 2011-11-22
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多