1

我的系统解析两个 XML 文件(通过JAXB解组和xjc生成的代码)

  • componentModel.xml :从建模工具生成
  • detailDesign.xml : 手册,添加信息

为了避免对内容和结构进行代码检查,每个文件都使用自己的 XSD 进行验证

  • 组件模型.xsd
  • 详细设计.xsd

这两个 xsd 都包括“utilities.xsd”,其中定义了常见的复杂和简单类型

一切正常

我现在想添加一致性检查:

  • Id 的唯一性(组件名称)
  • “detailsDesign”中的组件必须通过“name”和“nameRef”属性引用“componentModel”中的组件之一

以下是结构(我已简化文件中的名称和结构以仅显示相关信息)注意:如您所见,除了默认名称外,我不使用任何名称空间

组件模型.xml

<?xml version="1.0" encoding="UTF-8"?>
<componentModel>
    <components>
        <component name="id1"> ... </component>
        <component name="id1"> ... </component>
        <component name="id2"> ... </component>
    </components>
</componentModel>

组件模型.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >
<xs:include schemaLocation="utilities.xsd" />
<xs:complexType name="CMComponent">
    <xs:complexContent>
            ...
            <xs:attribute name="name" type="MUUpperFirstName" use="required" />
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="CMComponents">
        <xs:sequence>
        <xs:element name="component" type="CMComponent" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
</xs:complexType>
<xs:complexType name="CMComponentModel">
    <xs:complexContent>
            <xs:sequence>
                <xs:element name="components" type="CMComponents">
                    <!--  Key used to check "name" unicity and as a ref by nameRef attribute in detailedDesign model -->
                    <xs:key name="componentNameKey">
                        <xs:selector xpath="component" />
                        <xs:field xpath="@name" />
                    </xs:key>
                </xs:element>
                <xs:element name="functionalChains" minOccurs="0" maxOccurs="1" />
            </xs:sequence>
            <xs:attribute name="name" type="MUModelName" use="required" />
    </xs:complexContent>
</xs:complexType>

<xs:element name="componentModel" type="CMComponentModel" />
</xs:schema>

实用程序.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MUString">
    <xs:restriction base="xs:string"/>
</xs:simpleType>
<xs:simpleType name="MUUpperFirstName">
    <xs:restriction base="MUString">
        <xs:pattern value="([A-Z]+[a-zA-Z0-9]*[.])*[A-Z]+[a-zA-Z0-9]*"/>
    </xs:restriction>
</xs:simpleType>
<xs:simpleType name="MUReferenceName">
    <xs:restriction base="MUString">
        <xs:pattern value="([A-Z]+[a-zA-Z0-9]*[.])*[a-zA-Z]+[a-zA-Z0-9]*"/>
    </xs:restriction>
</xs:simpleType>
</xs:schema>

详细设计.xml

<?xml version="1.0" encoding="UTF-8"?>
<detailedDesignModel>
    <components>
        <component nameRef="id1"> ... </component>
        <component nameRef="id2"> ... </component>
        <component nameRef="id3"> ... </component>
    </components>
</detailedDesignModel>

详细设计.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="utilities.xsd" />
<xs:include schemaLocation="componentModel.xsd" />
<xs:complexType name="DDMComponent">
    <xs:complexContent>
        ...
        <xs:attribute name="nameRef" type="MUReferenceName" use="required" />
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="DDMComponents">
    <xs:sequence>           
        <xs:element name="component" type="DDMComponent" minOccurs="0" maxOccurs="unbounded" />
    </xs:sequence>
</xs:complexType>
<xs:complexType name="DDMDetailDesignModel">
    <xs:complexContent>
        <xs:sequence>
            <xs:element name="components" type="DDMComponents">
                <xs:keyref name="componentNameKeyRef" refer="componentNameKey">
                    <xs:selector xpath="component" />
                    <xs:field xpath="@nameRef" />
                </xs:keyref>
            </xs:element>
        </xs:sequence>
    </xs:complexContent>
</xs:complexType>

<xs:element name="detailDesignModel" type="DDMDetailDesignModel" />
</xs:schema>

它适用于组件之间“名称”属性的唯一性(从ValidationEventHandlerset on检索的错误unmarshaller):

为元素“组件”的标识约束声明的重复键值 [id1]。

但我无法使“keyref”功能正常工作(从ValidationEventHandlerset on检索错误unmarshaller):

身份约束错误:身份约束“KeyRef@272ed83b”有一个 keyref,它引用了超出范围的键或唯一值。

如何使 keyRef 以查看在其他 XSD 文件中定义的密钥

谢谢

马思

4

0 回答 0