针对类型而非元素的java XmlBeans XSD验证
我需要使用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”的消息为"Invalid type"
。只有在取消对XSD中的“Param”元素声明的注释,并通过向XML中添加名称空间前缀p1:
来更改“Param”的名称空间之后,验证才会成功,也就是说,在根据元素声明而不是类型声明进行验证时
我需要的是:
- 使用XmlBeans
- 以某种方式告诉XmlBeans,XML根中的元素
"{http://www.xxx.com/xmlns/osb/WS2CICS/Envelope/v01}Param"
是正常的(无需检查)李> - 告诉XmlBeans根是复杂类型
"{http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1}ParamType"
(检查子项)
我该怎么做
背景:
我有一个消息信封,其中“Param”元素的类型为“anyType”,即它可以包含任何内容。在特定情况下,我需要检查“Param”是否具有由动态选择的XSD提供的特定内容。我可以很容易地检查信封的有效性,但在第二步中,我还需要检查参数的有效性
编辑:重新措辞
# 1 楼答案
您需要记住,XSD模式文件只能有一个目标命名空间。这里要做的是在名称空间http://www.example.com/xmlns/osb/WS2CICS/program/PROG1/p1中定义complexType“ParamType”,在名称空间http://www.example.com/xmlns/osb/WS2CICS/Envelope/v01中定义元素“Param”。为此,您应该使用两个xsd模式(导入另一个模式),并更改XMLValidator类以获取额外的xsd文件输入,如下所示-
输入。xsd-
根。xsd-
XMLValidator-
导入根目录时。xsd内部输入。xsd,你需要正确地指向根。xsd。如果发现问题,可以使用根的绝对路径。xsd