当前位置: 首页 > 知识库问答 >
问题:

JavaXML验证,而无需事先了解模式

范侯林
2023-03-14

我可以接收82个XML结构中的一个,每个结构都包含一个不在名称空间中的根,还包含几个xmlns属性,其中第一个属性为对象的模式定义一个urn,其余的(定义名称空间)也包含公共对象的urn。

Java中的模式感知解析假设您在开始解析之前知道该模式,但我不知道它,直到我在未经验证的情况下加载了XML并提取了根,此时我可以使用正确的模式再次加载它,或者,我可以找到一些方法来访问根目录中的xmlns元素,并选择正确的模式(我知道如何将urn映射到正确的模式,并且所有模式都作为资源保存在我的类路径中)。

两次加载XML似乎很遗憾,有没有一种方法可以一次性加载?

作为一个例子,我有一个可能的文件,看起来像:-

<?xml version="1.0" encoding="UTF-8"?>
<BusinessCard xmlns="urn:oasis:names:specification:ubl:schema:xsd:BusinessCard-2"
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  </BusinessCard>

(BusinessCard对象中显然有内容,但我忽略了它,因为它在这里没有相关性)

我在参考资料“xsd/main/UBL-BusinessCard-2.2.xsd”中找到了这个模式。

我尝试过使用EntityResolver,但在解析器抱怨找不到名片声明之前,它没有被调用。

共有1个答案

宿建本
2023-03-14

我不知道为什么你说根不在命名空间中,当xmlns="urn: oasis: name:...声明清楚地表明它在命名空间中。

实现这一点的一种方法是加载一个包含所有不同组件模式的单一复合模式,并对此进行验证。如果模式的联合是一个有效的模式(即没有冲突的类型定义),那么这可能是最好的方法,特别是如果您正在验证数千个文档,并且大多数组件模式将在每次运行中使用。

另一方面,若在给定的运行中只使用少量的组件模式,那个么这将非常昂贵。

一种方法是使用对文档的中止解析来检测名称空间。编写一个SAX过滤器,捕获第一个名称空间声明,然后通过抛出异常中止解析。也可以通过流式XSLT 3.0转换来实现这一点。

更聪明的做法是编写一个小型SAX管道来进行缓冲。捕获第一个startElement事件,提取名称空间,加载模式,创建一个验证器,将您已经使用的SAX事件(第一个startElement)提供给它,然后将预处理器中的其余SAX事件直接提供给验证器。

 类似资料:
  • 我有一个带有几个布局复选框的表单:“[*]类型为a的项(计数:2)”。每个这样的复选框都附加了一个链接(在上面的布局中为“count:2”),该链接显示附加到相应复选框的列表中的项目数。该链接打开另一个表单,用于向列表中添加项。如果用户选中了这样一个复选框,链接就会被启用,她可以添加项目。但是,如果选中复选框并且没有添加任何项,则提交表单时必须显示错误。 我尝试使用AjaxCheckbox来启用/

  • 问题内容: 在Angular中是否可以以与验证表单类似的方式来验证单个隔离对象?我正在考虑这样的事情: 上面的示例不起作用。将其包含在中并替换为帮助。 不使用就可以做到吗? 问题答案: 您可以使用ng-form angular指令(请参阅此处的文档)对所有内容进行分组,即使是在html表单之外。然后,您可以利用有角度的FormController。 例

  • 如何通过firebase发送OTP并在不登录的情况下进行验证?与正常情况一样,firebase接收otp并使用PhoneNumber呼叫SigninWithSign,然后登录firebase。我不想用那种方法登录。我只想从firebase获得otp,并验证它是否正确,如果正确,则执行我的自定义操作。提前谢谢。或者,我需要使用otp进行自定义验证。建议我任何其他方法来验证otp是否正确(SMS)。

  • 本文向大家介绍CKEditor无法验证的解决方案(js验证+jQuery Validate验证),包括了CKEditor无法验证的解决方案(js验证+jQuery Validate验证)的使用技巧和注意事项,需要的朋友参考一下 最近项目的前端使用了jQuery,表单的前端验证用的是jQuery Validate,用起来很简单方便,一直都很满意的。 前段时间,根据需求为表单中的 textarea 类

  • 问题内容: 我正在尝试使用Python解析html文件,而不使用任何外部模块。原因是我正在触发jenkins作业,并遇到了lxml和BeautifulSoup的一些导入问题(试图解决该问题,我认为我在进行工程设计的某个方面来完成我的工作) 输入 : 输出 : 我想使用“ suite”类(末尾检查)来获取tr标记的特定块,然后提取零号,零号,零号和passRate套件的值。最后,打印值。 ~ ~ ~

  • 我对Web浏览器的基本身份验证有点困惑。我原以为Web浏览器只会在之前的响应中收到HTTP 401状态后发送授权标头。然而,似乎Chrome在之后的每个请求中都发送授权标头。它包含我曾经输入的数据,以响应我网站上的401,并与每条消息一起发送(根据Chrome和我的Web服务器附带的开发人员工具)。这是预期的行为吗?我应该在我的401中使用一些标头来推断不应该缓存授权内容吗?我目前正在使用WWW-