Java XSD Walker-以一系列XML标记的开始和结束作为输入遍历XSD

Java XSD Walker-以一系列XML标记的开始和结束作为输入遍历XSD,java,xml,xsd,xerces,xsom,Java,Xml,Xsd,Xerces,Xsom,基本上,我想要的是创建XSD的状态转换图表示。它不是一个简单的状态图;它应该反映合成器(全部、选择、顺序)、最小和最大出现次数以及派生(限制、扩展)。XSD遍历器必须能够做的是在每次向XSD提供XML标记时更新其在XSD状态图表示中的位置。它应该在标记关闭时回滚其位置。它应该能够确定向其提供XML标记是否会使XML无效,即遍历器无法找到给定XML标记的路径 我一直在使用XSOM及其functor visitor体系结构,但我无法使用XSOM实现合成器、事件和派生 你们中有人知道有哪个图书馆已经在

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

我一直在使用XSOM及其functor visitor体系结构,但我无法使用XSOM实现合成器、事件和派生

你们中有人知道有哪个图书馆已经在做这个了吗

或者关于如何构建这样的状态转换图有什么想法


或者更好的是,你们提供指向XML验证器代码的链接?这基本上就是XML验证器在根据XSD验证XML时所做的,对吗?

因此您需要构建一个XML验证器,它是一个状态机。它将ans XSD作为输入并构建一个状态机。然后机器运行XML并判断它是否有效。你想让跑步过程可视化吗

XSOM是用于解析XSD的库。下面是一个概述API的示例。XSD内容将成为状态机的状态。这应该类似于为正则表达式构建状态机

我首先为简单元素创建一些状态,例如,以这个模式()为例:


您将创建一个
开始
和一个
结束
状态。然后为元素创建状态
shiporder
。在
start
状态下启动。当您遇到
标记时,会从
开始
状态转换为
发货订单
状态。当您在
shiporder
状态中遇到字符串内容时,您将保持在
shiporder
状态。当您遇到结束标记
时,您将进入
结束
状态。如果遇到未定义转换的情况,验证将失败

当然,其他要素需要更复杂的逻辑。例如,
将具有到多个元素的转换

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

最后你会有一个或几个接受状态。当机器停在其中一个位置时,XML是有效的

对于状态机,您可能可以从中使用一个。也许你能找到一些可视化的东西,或者你可以使用一些类似于

或者更好的是,你们提供指向XML验证器代码的链接? 这基本上就是XML验证器在验证XML时所做的 反对XSD,对吗

看一看。既然您已经为您的问题添加了Java标签,那么请特别关注一个完全兼容的验证XML解析器

可以让Xerces为给定的XML模式构建一个。看看这本书


Xerces代码编写得很好,其XML和XSD(包括合成器、引用和派生)的实现坚如磐石。这将是一个很好的基础,也是一个很好的实现方案,因为你想要建立的状态转移图。如果我只考虑给定元素可能的子元素,那么创建状态图非常简单。但是,我很难为序列、选择、最小-最大出现次数、扩展/重定大小创建状态转换逻辑。我在寻求一种方法来实现这些状态转换逻辑。你知道如何为正则表达式构建一个状态机吗?例如,应该有足够的资源。你的序列
ab
,选项
a | b
,min-max
a{3,5}
也都存在于正则表达式中,只有在正则表达式中你有字符而不是标记,所以你应该能够使用相同的方法和原则。不过,扩展和限制可能需要特殊处理。
<?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>