针对自制模式的XML验证

时间:2015-09-06 16:44:38

标签: xml intellij-idea xsd

我需要通过xsd定义交换格式。我创建了一个示例xml文件,因为我想要它并且想要测试它是否符合我创建的本地xsd所以我试图通过IntelliJIDEA验证它并得到以下错误。请指出我做错了什么。

<?xml version="1.0" encoding="UTF-8"?>
<dictionaryResponse
        xmlns="http://dictionaries.persistence.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://dictionaries.persistence.com dictionaries.xsd">
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>1</id>
        <code>C</code>
    </entry>
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>2</id>
        <code>V</code>
    </entry>
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>3</id>
        <code>R2</code>
    </entry>
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>4</id>
        <code>TM</code>
    </entry>
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>5</id>
        <code>SN</code>
    </entry>
    <entry>
        <dictionaryCode>2</dictionaryCode>
        <id>6</id>
        <code>SA</code>
    </entry>
</dictionaryResponse>

dictionaries.xsd

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://dictionaries.persistence.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="dictionaryRequest">
        <xs:sequence>
            <xs:element name="dictionaryCode" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="dictionaryResponse">
        <xs:sequence>
            <xs:element name="entry" type="entry" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="entry">
        <xs:sequence>
            <xs:element name="dictionaryCode" type="xs:string"/>
            <xs:element name="id" type="xs:string"/>
            <xs:element name="code" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

错误:

  

错误:(12,74)src-resolve.4.1:解析组件&#39;条目&#39;时出错。检测到&#39;条目&#39;没有命名空间,但没有目标命名空间的组件不能从模式文档&file:///opt/idea-IC-141.1532.4/dictionaries.xsd'中引用。如果进入&#39;意图具有命名空间,可能需要提供前缀。如果打算进入&#39;没有命名空间,然后导入&#39;没有&#34;命名空间&#34;属性应添加到&#39; file:///opt/idea-IC-141.1532.4/dictionaries.xsd'。

     

错误:(5,83)cvc-elt.1:找不到元素的声明&#39; dictionaryResponse&#39;。

条目在相同的xsd中定义。我无法理解问题的根源是什么

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

您的XML文档是下面架构的有效实例。我改变了以下内容:

  • 为最外层元素xs:element添加了dictionaryResponse声明。声明该名称的类型是不够的,您还必须在元素声明中使用这种类型。
  • 向您的架构添加了elementFormDefault="qualified",因为目标命名空间应该应用于文档实例中的所有元素。没有它,您的架构需要 no 名称空间中的元素。
  • 使http://dictionaries.persistence.com架构文档的默认命名空间
  • entry元素的类型更改为entryType:不要对元素名称和类型名称使用相同的名称,这可能会导致很多混淆。

XML架构

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://dictionaries.persistence.com" xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified" xmlns="http://dictionaries.persistence.com">

    <xs:element name="dictionaryResponse" type="dictionaryResponseType"/>

    <xs:complexType name="dictionaryRequest">
        <xs:sequence>
            <xs:element name="dictionaryCode" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="dictionaryResponseType">
        <xs:sequence>
            <xs:element name="entry" type="entryType" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="entryType">
        <xs:sequence>
            <xs:element name="dictionaryCode" type="xs:string"/>
            <xs:element name="id" type="xs:string"/>
            <xs:element name="code" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>

</xs:schema>

示例文档中没有dictionaryRequest元素 - 您确定需要它的类型定义吗?