【问题标题】:JAXB problems with schema validation and xsi:type架构验证和 xsi:type 的 JAXB 问题
【发布时间】:2023-03-11 20:10:01
【问题描述】:

我正在尝试使用 JAXB 生成 XSD 以验证给定的 XML 文件,但某些元素的 xsi:type 属性存在问题。我怀疑这是一个命名空间问题,但我不知道我到底做错了什么。

当我尝试验证时,我得到 UIDataConnection 的 cvc-elt.4.2 错误

Fehler: cvc-elt.4.2: Cannot resolve 'UIDataConnection' to a type definition for element 'UIData'.

这暗示我这是一个命名空间问题

这是 XML

<?xml version="1.0" encoding="utf-8"?>
<InformationWorkflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://foo/bar/baz" workflowguid="22b1941c-efc1-4084-89e6-25dc5eae5161" creator="rbo" creationdate="2014-05-22T14:19:20.4356295+02:00" idnprefix="">
  <Name>QA_14-05-22_v1</Name>
  <Connections>
    <C idn="c:14" start="out:2.2" end="end:3">
      <UIData xsi:type="UIDataConnection" row="0" column="0">
        <ConnectionAnchor>Unset</ConnectionAnchor>
        <ConnectionAnchorOffset>0</ConnectionAnchorOffset>
      </UIData>
      <ConnectionType>Node</ConnectionType>
    </C>
    <C idn="c:15" start="out:2.3" end="end:2">
      <UIData xsi:type="UIDataConnection" row="0" column="0">
        <ConnectionAnchor>Unset</ConnectionAnchor>
        <ConnectionAnchorOffset>0</ConnectionAnchorOffset>
      </UIData>
      <ConnectionType>Node</ConnectionType>
    </C>
  </Connections>
</InformationWorkflow>

这是我的 XSD:

<xs:schema elementFormDefault="qualified" version="1.0" targetNamespace="http://foo/bar/baz" xmlns:tns="http://foo/bar/baz" xmlns:knsf="http://foo/bar/thing" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

  <xs:import namespace="http://foo/bar/thing" schemaLocation="schema2.xsd"/>

  <xs:import schemaLocation="schema3.xsd"/>

  <xs:element name="C" type="tns:connection"/>

  <xs:element name="InformationWorkflow" type="tns:typeKnsModel"/>

  <xs:complexType name="typeKnsModel">
    <xs:complexContent>
      <xs:extension base="tns:dataType">
        <xs:sequence>
          <xs:element name="Name" type="xs:string"/>
          <xs:element name="Connections" minOccurs="0">
            <xs:complexType>
              <xs:sequence>
                <xs:element ref="tns:C" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="dataType" abstract="true">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="connection">
    <xs:sequence>
      <xs:element name="label" type="xs:string" minOccurs="0"/>
      <xs:element name="UIData" type="tns:uiDataConnection" minOccurs="0"/>
      <xs:element name="ConnectionType" type="xs:string" minOccurs="0"/>
      <xs:element name="Description" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="uiDataConnection">
    <xs:complexContent>
      <xs:extension base="tns:uiData">
        <xs:sequence>
          <xs:element name="ConnectionAnchor" type="xs:string" minOccurs="0"/>
          <xs:element name="ConnectionAnchorOffset" type="xs:double"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="uiData">
    <xs:sequence/>
    <xs:attribute name="column" type="xs:int" use="required"/>
    <xs:attribute name="row" type="xs:int" use="required"/>
  </xs:complexType>
</xs:schema>

在带注释的 Java 代码中,UIDataConnection 类扩展了 UIData

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "C")
public class Connection
{
    @XmlElement(name = "label")
    private String label;

    @XmlElement(name = "UIData", type = UIDataConnection.class)
    private UIDataConnection uiData;

    @XmlElement(name = "ConnectionType")
    private String connectionType;

    @XmlElement(name = "Description")
    private String description;
}

...

import javax.xml.bind.annotation.XmlAttribute;
public class UIData
{
    @XmlAttribute( name = "column", required = true)
    private int column;

    @XmlAttribute( name = "row", required = true)
    private int row;

}

...

import javax.xml.bind.annotation.XmlElement;

public class UIDataConnection extends UIData
{
    @XmlElement( name = "ConnectionAnchor")
    private String connectionAnchor;

    @XmlElement( name = "ConnectionAnchorOffset")
    private double connectionAnchorOffset;

}

我的 package-info.java 包含

@XmlSchema(
    namespace = "http://foo/bar/baz",
    elementFormDefault = XmlNsForm.QUALIFIED,
    xmlns={
        @XmlNs(prefix="knsf", namespaceURI="http://foo/bar/thing"),
        @XmlNs(prefix="xsi", namespaceURI = "http://www.w3.org/2001/XMLSchema-instance")
    }
)

XML 和架构中有更多 UIData 元素,但我认为它们与这里无关。

如何正确处理 xsi:type?我真的需要在 package-info 中定义 xsi 命名空间吗?

【问题讨论】:

    标签: java xml jaxb xsd xsd-validation


    【解决方案1】:

    您的 XML 模式定义了复杂类型 uiDataConnection,而您的 XML 文档引用了复杂类型 UIDataConnection。你可以使用@XmlType注解来控制一个类对应的类型名。

    @XmlType(name="uiDataConnection")
    public class UIDataConnection extends UIData
    

    【讨论】:

    • 谢谢。我的印象是,如果类名等于 xml 类型的名称就足够了
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2015-04-20
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    相关资源
    最近更新 更多