2

基本上我想要的是创建一个 XSD 的状态转换图表示。这不是一个简单的状态图;它应该反映合成器(All、Choice、Sequence)、最小和最大出现次数以及派生(限制、扩展)。XSD 遍历器必须能够在每次向其提供 XML 标记时更新其在 XSD 的状态图表示中的位置。它应该在关闭标签时回滚其位置。它应该能够确定向其提供 XML 标记是否会使 XML 无效,即遍历器无法找到给定 XML 标记的路径。

我一直在使用 XSOM,它是函子访问者架构,但我无法使用 XSOM 实现合成器、发生和派生。

你们中的任何人都知道任何已经这样做的图书馆吗?

或者关于如何构建这种状态转换图的任何想法?

或者更好的是,你们提供了 XML 验证器代码的链接?这基本上是 XML 验证器在针对 XSD 验证 XML 时所做的事情,对吧?

4

2 回答 2

1

因此,您想要构建一个 XML 验证器,它是一个状态机。它以 ans XSD 作为输入并构建状态机。然后机器在 XML 上运行并计算它是否有效。你想要运行可视化吗?

XSOM 是用于解析 XSD 的库。这是概述 API的用户指南。XSD 内容将成为您的状态机的状态。这应该类似于为正则表达式构建状态机。

我将从为简单元素创建一些状态开始,例如采用此模式(此处有更多示例):

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="shiporder" type="xs:string" />
</xs:schema>

你会创建一个start和一个end状态。然后为元素创建一个状态shiporder。您从该start州开始。当您遇到<shiporder>标签时,会有一个从startshiporder状态的转换。当您在该shiporder州遇到字符串内容时,您将留在该shiporder州。当您遇到结束标签时</shiporder>,您将进入该end州。如果您遇到没有定义转换的内容,则验证失败。

其他元素当然需要更复杂的逻辑。例如,一个<xs:sequence>将转换到多个元素。

然后您将使用 SAX 来读取 XML。发出的事件是触发转换的状态机的输入事件。

最后,您将拥有一个或几个接受状态。当机器在其中之一停止时,XML 是有效的。

对于状态机,您可能可以使用这个问题中的一个。也许你找到了一些东西来可视化这些,或者你使用像DFA Simulator这样的东西。

于 2014-02-27T18:24:52.360 回答
1

或者更好的是,你们提供了 XML 验证器代码的链接?这基本上是 XML 验证器在针对 XSD 验证 XML 时所做的事情,对吧?

看看Apache Xerces 项目。由于您已将问题标记为 Java,因此请特别查看Xerces2 Java Parser,这是一个完全兼容的验证 XML 解析器。

可以让 Xerces 为给定的 XML Schema 构建可重用的语法。查看xni.XMLGrammarBuilder 示例

Xerces 代码编写得很好,它对 XML 和 XSD(包括合成器、出现和派生)的实现坚如磐石。它将作为您寻求构建的状态转换图的良好基础和实现想法的良好来源。

于 2014-03-05T03:15:20.183 回答