Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java xml验证失败,出现“属性必需”和“属性不允许”错误,该错误不明确_Java_Xml_Validation_Xsd - Fatal编程技术网

Java xml验证失败,出现“属性必需”和“属性不允许”错误,该错误不明确

Java xml验证失败,出现“属性必需”和“属性不允许”错误,该错误不明确,java,xml,validation,xsd,Java,Xml,Validation,Xsd,我为XML定义了以下模式 <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.learnjava.com" xmlns="http://www.learnjava.com"

我为XML定义了以下模式

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

    <!-- simple elements -->
    <xs:element name="name" type="xs:string"/>
    <xs:element name="hod" type="xs:string"/>
    <xs:element name="dept" type="xs:integer"/>

    <!-- attributes -->
    <xs:attribute name="id" type="xs:integer"/>

    <!-- complex elements -->
    <xs:element name="department">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="hod" minOccurs="0"/>
            </xs:sequence>
            <xs:attribute ref="id" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="departments">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="department"  maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="student">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="dept"/>
            </xs:sequence>
            <xs:attribute ref="id" use="required"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="students">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="student"  maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="school">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="name"/>
                <xs:element ref="departments"/>
                <xs:element ref="students"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>

</xs:schema>
但验证失败,出现以下错误

Error - Line 7, 25: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 25; cvc-complex-type.3.2.2: Attribute 'id' is not allowed to appear in element 'department'.
Error - Line 7, 25: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 25; cvc-complex-type.4: Attribute 'id' must appear on element 'department'.
[..further errors omited...]
我不知道到底出了什么问题。这两条错误消息相互矛盾

如果我从和中删除了“id”属性,以及当我有“id”属性时,验证将失败

我有一个解决办法,通过修改XSD来实现这一点,如下所示

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    targetNamespace="http://www.learnjava.com"
                    xmlns="http://www.learnjava.com"
                    elementFormDefault="qualified">
    <xs:element name="school">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="departments">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="department" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string"/>
                                        <xs:element name="hod" type="xs:string" minOccurs="0"/>
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:integer"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="students">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="student" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string"/>
                                        <xs:element name="dept" type="xs:integer"/>
                                    </xs:sequence>
                                    <xs:attribute name="id" type="xs:integer"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

但作为一名XML新手,我很想知道早期XSD中的错误

附言:
1.我正在使用来根据XSD验证XML。

2.我在Altova XML Spy editor中也观察到了相同的错误。

问题在于属性
id
已声明为全局(xs:schema的直接子级)。因此,属性
id
应该使用名称空间
http://www.learnjava.com.
请注意,
id
http://www.learnjava.com:id
如果不希望属性
id
属于名称空间,请执行以下操作:

  • 您应该使用本地属性声明
  • 在模式文档中,更改

     <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                    targetNamespace="http://www.learnjava.com"
                    xmlns="http://www.learnjava.com"
                    elementFormDefault="qualified"
                    attributeFormDefault="qualified">
    
    
    
  • 
    
    更新:

    如果要使用全局属性声明,则xml实例文档如下所示:

    <p:school xmlns:p="http://www.learnjava.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.learnjava.com ex2.xsd">
        <p:name>TAMUC</p:name>
        <p:departments>
            <p:department p:id="1001">
                <p:name>Computer Science</p:name>
    
            </p:department>
            <p:department p:id="1002">
                <p:name>Social Science</p:name>
                <p:hod>Jeff</p:hod>
            </p:department>
        </p:departments>
        <p:students>
            <p:student p:id="5001">
                <p:name>Frank</p:name>
                <p:dept>1001</p:dept>
            </p:student>
            <p:student p:id="5002">
                <p:name>Paul</p:name>
                <p:dept>1001</p:dept>
            </p:student>
        </p:students>
    </p:school>
    
    
    塔穆克
    计算机科学
    社会科学
    杰夫
    直率的
    1001
    保罗
    1001
    
    我想跨
    标记重用
    id
    属性声明。所以,我想让它全球化。我尝试按照您的建议删除attributeFormDefault,但没有将属性声明设置为本地,真是倒霉!!进行全局属性声明,这意味着必须在xml实例文档中对其进行限定。在xml文档中,应该使用带前缀的名称空间。此属性必须使用带前缀的名称空间进行限定。我应用了您的建议,现在效果很好。我有几个问题。1.为什么我需要用名称空间前缀限定属性?2.为什么只有属性?为什么不是其他元素的?(即使元素声明为全局)如果使用targetNamespace,则全局声明的每个节点(元素、属性)都必须由命名空间限定。1.因为默认命名空间不适用于属性名称。2.否。这些元素使用默认名称空间限定(默认名称空间声明适用于其范围内所有未固定的元素名称)。谢谢@Win.ubuntu。这对我来说是一种学习。我不知道默认名称空间不适用于属性名称。我的问题得到了回答,谢谢你对这个社区的贡献!
         <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                        targetNamespace="http://www.learnjava.com"
                        xmlns="http://www.learnjava.com"
                        elementFormDefault="qualified"
                       >
    
    <p:school xmlns:p="http://www.learnjava.com"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.learnjava.com ex2.xsd">
        <p:name>TAMUC</p:name>
        <p:departments>
            <p:department p:id="1001">
                <p:name>Computer Science</p:name>
    
            </p:department>
            <p:department p:id="1002">
                <p:name>Social Science</p:name>
                <p:hod>Jeff</p:hod>
            </p:department>
        </p:departments>
        <p:students>
            <p:student p:id="5001">
                <p:name>Frank</p:name>
                <p:dept>1001</p:dept>
            </p:student>
            <p:student p:id="5002">
                <p:name>Paul</p:name>
                <p:dept>1001</p:dept>
            </p:student>
        </p:students>
    </p:school>