我正在尝试做一些不可能的事情。
我有一个包含相同类型记录列表的 XML 文档。像这样的东西:
<root>
<record>I'm a shark.</record>
<record>I'm a shark.</record>
<record>Suck it.</record>
<record>I'm a shark.</record>
</root>
首先,我通过 XSD 运行它以确保标签正确。然后,我解组它并对实际值进行一些编程验证。我想通过<xs:pattern />
(将值与正则表达式匹配以测试有效性)将第二步折叠到 XSD 中。
问题是我有一个业务规则,我应该继续处理 XML 文档中列出的所有有效记录,并且只处理无效的特定记录。在我上面的例子中,我想要让“Suck it”失败。重视并传递所有“我是鲨鱼”。值转发到某些处理步骤以供实际使用。
不幸的是,据我所知,在 XSD 中,如果一个部分失败,则整个文档只是“糟糕”并且无法通过验证。所以,在我上面的例子中,“Suck it”。value 删除整个文档。有没有办法解决这个问题?我只是坚持我的第二个编程步骤吗?如果我只能使单个标签而不是整个文档失败,是否有某种方法可以解决“此标签因这个原因而失败”。在验证期间?
编辑:我最终使用了一个SAXParser
带有Schema
集合的 a ,并给它一个扩展的自定义类,该类DefaultHandler
在某种程度上手动处理 XML。
Node
我在我的 custom 内部设置了一个私有类DefaultHandler
,这是一个非常简单的 Tree 实现。每个都Node
包含一个开始标记、值和结束标记,都存储为String
s,以及与父级和子级的关系。每当我收到一条SAXException
包含以“cvc-pattern-valid”或“cvc-type.3.1.3”(或我想要捕获的任何 XML 错误)开头的消息时,我都会Node
从树中删除 I'm in the middle of我正在建造(因为它坏了),然后继续下一个。String
然后,当我通过调用Node.depthFirstSearch()
根(使用各种StringBuilder
s)完成解析时,我可以将整个文档(减去剔除的标签)输出为一个大 XML 。
我现在的问题是感觉就像我做了大量的工作只是为了将 XML 视为 XML。我必须重新添加 " <
"、" >
" 和 " <\
" 字符,因为其中的方法DefaultHandler
只给了我像 stripped 之类的东西qName
。所有这些树的构建和遍历似乎效率低下;喜欢太多的工作。当然必须有一个更简单的方法?
注意:我想将 XML 保留为 XML 的原因是因为这是我以前的工作流程:
XSD -> XSLT -> Unmarshal to JAXB-Annotated Object
现在是这样的:
SAXParser(XSD) -> XSLT -> Unmarshal to JAXB-Annotated Object
也许有一些神奇的方法可以做到:
SAXParser(XSD, XSLT) -> Unmarshal to JAXB-Annotated Object
或者
SAXParser(XSD, XSLT, Unmarshal to JAXB-Annotated Object)
但我不知道那会是什么。
编辑:好吧,除了可能的低效率之外,扩展DefaultHandler
,覆盖DefaultHandler.error(SAXParseException exception)
是正确的答案,至少对我来说。因此,Petru 得到了梦寐以求的绿色复选标记。