父复杂类型元素中的唯一简单类型元素

时间:2015-10-15 07:05:40

标签: xml unique

我希望为FamilyConvention复杂类型的Name元素添加唯一约束。出于某种原因,下面的模式不会检测重复的名称:

<xs:element name="ValidatedConvention">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="Family" type="FamilyConvention" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="KeyFamilyName">            
        <xs:selector xpath="Family/Name"/>          
        <xs:field xpath="."/>
    </xs:unique>
</xs:element>
<xs:complexType name="FamilyConvention">
    <xs:sequence>
        <xs:element name="Name" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="([a-zA-Z0-9])+" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

与此XML比较:

<ValidatedConvention">
    <Family>
        <Name>john</Name>
    </Family>           
    <Family>
        <Name>john</Name>
    </Family>
</ValidatedConvention >

你看到我的架构有什么问题吗?

2 个答案:

答案 0 :(得分:0)

似乎有效

使用http://www.utilities-online.info/xsdvalidation/

我得到了:

无效。 错误 - 第9行,第26行:org.xml.sax.SAXParseException; lineNumber:9; columnNumber:26;为元素的身份约束声明的重复唯一值[john]&#34; ValidatedConvention&#34;。

这似乎是你希望的结果

为了能够测试你的xml,我必须添加一个目标命名空间和xml版本 这就是我使用的代码:

<强> XML

<?xml version='1.0' encoding='utf-8'?>
<ValidatedConvention xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Family>
        <Name>john</Name>
    </Family>           
    <Family>
        <Name>john</Name>
    </Family>
</ValidatedConvention >

<强> XSD

<?xml version='1.0' encoding='utf-8'?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ValidatedConvention">
   <xs:complexType>
      <xs:sequence>
        <xs:element name="Family" type="FamilyConvention" minOccurs="1" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>

    <xs:unique name="KeyFamilyName">            
        <xs:selector xpath="Family/Name"/>          
        <xs:field xpath="."/>
    </xs:unique>
</xs:element>

<xs:complexType name="FamilyConvention">
    <xs:sequence>
        <xs:element name="Name" minOccurs="1" maxOccurs="1">
            <xs:simpleType>
                <xs:restriction base="xs:string">
                    <xs:pattern value="([a-zA-Z0-9])+" />
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>
</xs:schema>
顺便说一句:你有一个&#34;在根元素的末尾:ValidatedConvention

更新

是的,命名空间导致问题。请参阅初始问题下的评论。

请参阅:https://msdn.microsoft.com/en-us/library/ms757863(v=vs.85).aspx了解如何引用架构

答案 1 :(得分:0)

感谢您的回答!

我的原始命名空间详细信息是:

XML:

<ValidatedConvention xmlns="dnx_ns" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="dnx_ns file:///C:/Users/summer/workspace/project1/NewXMLSchema.xsd ">

模式:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="dnx_ns" xmlns="dnx_ns" elementFormDefault="qualified">

他们错了吗?如何在没有它的情况下将我的XML引用到我的架构?