我需要使用XmlBeans针对在以下XSD中声明的(复杂)类型验证以下XML。XmlBeans - 针对某个类型的XSD验证,而不是元素
我的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验证。但验证失败,消息"Invalid type"
对元素“参数”。只有通过在XSD中取消注释“Param”元素声明并在XML中添加名称空间前缀p1:
来更改XML中的“Param”的名称空间之后,验证才能成功 - 即在对元素声明进行验证时,不是对类型声明。
我需要的是:
- 使用XMLBeans
- 莫名其妙地告诉它XmlBeans的是,在XML根元素
"{http://www.xxx.com/xmlns/osb/WS2CICS/Envelope/v01}Param"
是OK(不需要检查)。 - 告诉XmlBeans的根是复杂类型
"{http://www.xxx.com/xmlns/osb/WS2CICS/program/PROG1/p1}ParamType"
的(检查儿童)
我该怎么做呢?
背景:
我有一个邮件信封里的“参数”元件的类型是“anyType的”,即,它可以具有任何内容。在特定情况下,我需要检查“Param”是否具有由动态选择的XSD提供的特定内容。我可以很容易地检查信封的有效性,但在第二步中,我需要检查Param的有效性。
编辑:重新表述
通过实验我找到了同样的解决方案 - 除了在代码中动态内联生成元素“Param”的模式外。但是,不知何故,我希望会有更好的解决方案 - 这样XmlBeans将只验证“Param”元素的内容,而不是元素本身,这将删除“Param”元素的模式必要性。 loader.parse(...)方法有一个SchemaType作为第二个参数。但是我没有成功地使它工作。也许这将是方式? – xarx
基本上,您要求验证xml的某些部分,但不包括其他部分。我不确定你是否可以做到这一点。 – IndoKnight
关于我原来问题中的“背景”评论,你会如何解决这个问题?你会使用你在答案中建议的解决方案吗? – xarx