两个对象之间关系的xsd验证



我有这个xsd

 <xs:complexType name="ShapeLine">
    <xs:annotation>
        <xs:documentation>
            ShapeLine - the line between two shapes
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="archimate:Line" >
            <xs:attribute name="category" type="xs:string" use="required"> 
            </xs:attribute> 
            <xs:attribute name="source" type="xs:IDREF" use="required" />
            <xs:attribute name="target" type="xs:IDREF" use="required" />
        </xs:extension>             
    </xs:complexContent>
</xs:complexType>
    
 <xs:complexType name="Shape">
    <xs:annotation>
        <xs:documentation>
            Shape object
        </xs:documentation>
    </xs:annotation>
    <xs:complexContent>
        <xs:extension base="archimate:ViewNodeType" >                          
          <xs:attribute name="shapeId" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>
                        shapeId contains the id of the shape
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute> 
              <xs:attribute name="name_internal" type="xs:string" use="required">
                <xs:annotation>
                    <xs:documentation>
                        name_internal contains the name_internal of the shape
                    </xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这就是我需要验证的xml:

 <views>
 <diagrams>
  <view identifier="id-7b98c8ec-243a-49fb-b6b0-baa68c95badb">
    <name xml:lang="EN">helloe</name>
    <node xsi:type="q1:Shape" identifier="id-1d599237- 
 76af-4fc7-8d9a-c4356c3b2137" x="10" y="30" w="1" h="1" name_internal="BD_shapes_av_Box" 
shapeId="5da9cedd0c0ba649f8cae72e" angle="0" isgroup="False" alignment="" textalign="0" size="72 72">            
    </node>
    <node xsi:type="q2:Shape" identifier="id-76efea7a-6cf3-4cf0-bbd4-e36597c0653b" x="454" y="54" w="1" h="1" name_internal="BD_shapes_av_Two sided arrow" shapeId="5dad549f0c0ba639c4a5a3ac" angle="0" isgroup="False" alignment="" textalign="0" size="72 30,476">         
    </node>
    <connection xsi:type="q3:ShapeLine" identifier="id-4ab26cbf-509b-4657-b066-1a676a2773eb" source="id-1d599237-76af-4fc7-8d9a-c4356c3b2137" target="id-76efea7a-6cf3-4cf0-bbd4-e36597c0653b" category="line_dottednoarrows">         
      <sourceAttachment x="82" y="66" />
      <targetAttachment x="454" y="69" />
    </connection>
  </view>
</diagrams>

我需要创建xsd验证,以便只允许在Shape类型的对象之间使用ShapeLine。这能在xsd中实现吗?我是xsd-s的新手,所以任何帮助都将不胜感激。

我真的不确定我是否正确理解了这个问题。我想我遗漏了所需的信息。您要求创建一个xml模式定义来验证xml,以确保shape类型的元素可以具有shapeline类型的子元素。但在示例xml中,shapeline类型的元素是shape类型元素的兄弟元素。q1:Shape en q2:Shape让我想到有两种Shape类型具有不同的名称空间,或者q1和q2名称空间前缀指向相同的实际名称空间。

类型必须分配给元素或属性,而这些元素和属性正在创建消息的布局。不能仅使用类型来描述xml消息来创建xsd。您需要将类型分配给元素和/或属性。使用这些元素和属性创建的顺序和结构将决定xml消息的外观。

下面的xml示例中有两个选项。首先是同级子项,然后是同级

<?xml version="1.0" encoding="UTF-8"?>
<ns:root xmlns:ns="http://tempuri.org/example" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <ns:Sibling1 attr1="text" attr2="text">
        <ns:Child1 xsi:type="ns:ShapeLine">
            <ns:Child2>text</ns:Child2>
            <ns:Child3>text</ns:Child3>
        </ns:Child1>
    </ns:Sibling1>
    <ns:Sibling2 attr1="text" attr2="text" xsi:type="ns:Shape"/>
    <ns:Sibling3 xsi:type="ns:ShapeLine">
        <ns:Child2>text</ns:Child2>
        <ns:Child3>text</ns:Child3>
    </ns:Sibling3>
</ns:root>

这个示例xml是从下面的xsd生成的。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns="http://tempuri.org/example" targetNamespace="http://tempuri.org/example" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="root">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Sibling1">
                    <xs:complexType>
                        <xs:complexContent>
                            <xs:extension base="ns:Shape">
                                <xs:sequence>
                                    <xs:element name="Child1" type="ns:ShapeLine"/>
                                </xs:sequence>
                            </xs:extension>
                        </xs:complexContent>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Sibling2" type="ns:Shape"/>
                <xs:element name="Sibling3" type="ns:ShapeLine"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="Shape">
        <xs:attribute name="attr1"/>
        <xs:attribute name="attr2"/>
    </xs:complexType>
    <xs:complexType name="ShapeLine">
        <xs:sequence>
            <xs:element name="Child2"/>
            <xs:element name="Child3"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

这是你想要实现的一个非常简单的版本,但希望它能帮助你开始。

相关内容

  • 没有找到相关文章

最新更新