gpt4 book ai didi

java - XmlBeans - 针对类型而非元素的 XSD 验证

转载 作者:行者123 更新时间:2023-12-01 13:28:36 25 4
gpt4 key购买 nike

我需要使用 XmlBeans 针对以下 XSD 中声明的(复杂)类型验证以下 XML。

我的 XSD:

<xs:schema targetNamespace="http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1" attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns="http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1"
xmlns:ct="http://www.xxx.com/xmlns/osb/WS2CICS/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<!--xs:element name="Param" type="ParamType"/-->

<xs:complexType name="ParamType">
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

我的 XML:

<Param xsi:type="p1:ParamType"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.xxx.com/xmlns/osb/WS2CICS/Envelope/v01"
xmlns:p1="http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1">

<p1:Text>abc</p1:Text>

</Param>

我基本上使用 this site 中的代码使用 XmlBeans 进行 XML 验证。但验证失败,并显示元素“Param”的消息“无效类型”。仅在取消注释 XSD 中的“Param”元素声明并通过添加命名空间前缀 p1: 更改 XML 中“Param”的命名空间后,验证才会成功 - 即验证时元素声明,而不是类型声明。

我需要的是:

  1. 使用 XmlBean
  2. 以某种方式告诉 XmlBeans XML 根中的元素 "{http://www.xxx.com/xmlns/osb/WS2CICS/Envelope/v01}Param" 没问题(不需要检查)。
  3. 告诉 XmlBeans 根是复杂类型“{http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1}ParamType”(以检查子项)

我该怎么做?

背景:

我有一个消息信封,其中“Param”元素的类型为“anyType”,即它可以包含任何内容。在特定情况下,我需要检查“Param”是否具有由动态选择的 XSD 给出的特定内容。我可以轻松检查信封的有效性,但在第二步中,我还需要检查 Param 的有效性。

编辑:重新措辞

最佳答案

您需要记住,一个 XSD 架构文件只能有一个目标 namespace 。您在这里尝试做的是在命名空间 http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1 中定义一个复杂类型“ParamType”和命名空间中的元素“Param”http://www.example.com/xmlns/osb/WS2CICS/Envelope/v01 。您应该为此使用两个 xsd 架构(导入另一个)并更改您的 XMLValidator 类以获取额外的 xsd 文件输入,如下所示 -

输入.xsd -

<xs:schema targetNamespace="http://www.example.com/xmlns/osb/WS2CICS/Envelope/v01"                         attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns:p1="http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1"
xmlns="http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1"
xmlns:ct="http://www.example.com/xmlns/osb/WS2CICS/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:import namespace="http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1 root.xsd"/>

<xs:element name="Param" type="ParamType"/>

</xs:schema>

root.xsd -

 <xs:schema targetNamespace="http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1" attributeFormDefault="unqualified" elementFormDefault="qualified"
xmlns="http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1"
xmlns:ct="http://www.example.com/xmlns/osb/WS2CICS/common"
xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:complexType name="ParamType">
<xs:sequence>
<xs:element name="Text" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

XMLValidator -

 ...
public boolean validate(File dataFile, File schemaFile, File schemaFile2) {
...

...
XmlObject[] schemas = { XmlObject.Factory.parse(schemaFile,
new XmlOptions().setLoadLineNumbers()
.setLoadMessageDigest()), XmlObject.Factory.parse(schemaFile2,
new XmlOptions().setLoadLineNumbers()
.setLoadMessageDigest()) };
...

在input.xsd中导入root.xsd时,需要正确指向root.xsd。如果发现问题,可以使用root.xsd的绝对路径。

关于java - XmlBeans - 针对类型而非元素的 XSD 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21681774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com