【发布时间】:2009-09-16 21:03:23
【问题描述】:
假设我有一个 XML 文档(表示为文本、一个 W3C DOM 等等),还有一个 XML Schema。 XML 文档包含架构定义的所有正确元素,但顺序错误。
如何使用架构“重新排序”文档中的元素以符合架构定义的顺序?
我知道这应该是可能的,可能使用XSOM,因为 JAXB XJC 代码生成器使用元素的正确序列化顺序注释其生成的类。
但是,我对 XSOM API 并不熟悉,而且它非常密集,所以我希望你们中的某个人对它有一些经验,并且可以为我指明正确的方向。类似“在这个父元素中允许哪些子元素,以及以什么顺序?”
让我举个例子。
我有一个这样的 XML 文档:
<A>
<Y/>
<X/>
</A>
我有一个 XML Schema,它表示 <A> 的内容必须是 <X> 后跟 <Y>。现在很明显,如果我尝试根据架构验证文档,它会失败,因为 <X> 和 <Y> 的顺序错误。但是我提前知道我的文档是“错误的”,所以我还没有使用模式来验证。但是,我确实知道我的文档包含架构定义的所有正确元素,只是顺序错误。
我想做的是以编程方式检查 Schema(可能使用 XSOM - 这是 XML Schema 的对象模型),并询问<A> 的内容应该是什么。 API 将公开“您需要<X> 后跟<Y>”的信息。
所以我使用我的 XML 文档(使用 DOM API)并相应地重新排列,以便现在文档将根据架构进行验证。
了解 XSOM 在这里很重要 - 它是一个 java API,代表 XML Schema 中包含的信息,不是我的实例文档中包含的信息。
我不想从架构生成代码,因为架构在构建时是未知的。此外,XSLT 没有用处,因为元素的正确顺序仅由模式中包含的数据字典决定。
希望现在已经足够明确了。
【问题讨论】:
-
输入有什么限制?你举了一个相当简单的例子,但显然可以有更复杂的情况,比如选择(序列(选择(...)))。此外,是否事先知道输入文档可以通过重新排序元素来符合模式?如果这不是保证,那么坦率地说,我什至不知道从哪里开始。
-
是的,我提前知道正确的元素都在那里,但是顺序已经被前面的处理步骤有效地随机化了。您说得对,架构类型定义的潜在复杂性可能令人生畏,这就是为什么我希望 XSOM 能够为我破译并以简单的方式向我展示它的原因。
-
就我所见,XSOM 并没有真正简化任何事情——它更像是用于 XML Schema 的强类型 DOM。它主要为您提供了使用现成的解析器和类似 AST 的结构的便利,但对您想要的没有任何帮助。因此,无论您处理 XML Schema 的方式如何,解决方案都是通用的。
-
XOM 的功能远不止 XSD 解析器,它理解模式结构的含义。例如,JAXB 的代码生成器使用 XSOM 来确定要生成什么代码。
-
“理解意义”是什么意思?我在这里查看 JavaDoc:xsom.dev.java.net/nonav/javadoc/index.html - 据我所知,它几乎是一对一的映射;例如
xs:choice或xs:sequence将映射到XSModelGroup的实例。 .NET 有一个类似的 API,但它也有一个有趣的地方,它可以让您逐个节点验证文档(推,而不是拉),然后中途停止并询问它可能遵循的有效粒子的详尽列表在此刻。我在 XSOM 中没有看到这一点,但也许我只是在看错误的地方?如果它在那里会有所帮助。