有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

针对类型而非元素的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”的名称空间之后,验证才会成功,也就是说,在根据元素声明而不是类型声明进行验证时

我需要的是:

  1. 使用XmlBeans
  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提供的特定内容。我可以很容易地检查信封的有效性,但在第二步中,我还需要检查参数的有效性

编辑:重新措辞


共 (1) 个答案

  1. # 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-

    <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>
    

    根。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()) };
     ...
    

    导入根目录时。xsd内部输入。xsd,你需要正确地指向根。xsd。如果发现问题,可以使用根的绝对路径。xsd