s4s-att-invalid-value:元素'element'中'name'的属性值无效

时间:2017-02-20 18:00:36

标签: java xml xsd xsd-validation

XML

<ns2:Response xmlns:ns2="http://test.com/" Id="122212">
  <Infos size="1">
     <Info>
        <name>test</name>
     </Info>
  </Infos>
</ns2:Response>

生成XSD

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
     <!-- XML Schema Generated from XML Document on Mon Feb 20 2017 23:20:03 GMT+0530 (India Standard Time) -->
     <!-- with XmlGrid.net Free Online Service http://xmlgrid.net -->
     <xs:element name="ns2:Response">
           <xs:complexType>
                 <xs:sequence>
                       <xs:element name="Infos">
                             <xs:complexType>
                                   <xs:sequence>
                                         <xs:element name="Info">
                                               <xs:complexType>
                                                     <xs:sequence>
                                                           <xs:element name="name" type="xs:string"></xs:element>
                                                     </xs:sequence>
                                               </xs:complexType>
                                         </xs:element>
                                   </xs:sequence>
                                   <xs:attribute name="size" type="xs:int"></xs:attribute>
                             </xs:complexType>
                       </xs:element>
                 </xs:sequence>
                 <xs:attribute name="xmlns:ns2" type="xs:string"></xs:attribute>
                 <xs:attribute name="Id" type="xs:int"></xs:attribute>
           </xs:complexType>
     </xs:element>

错误

  

SAX异常:s4s-att-invalid-value:无效的属性值   元素'element'中的'name'。记录原因:   cvc-datatype-valid.1.2.1:'ns2:Response'不是有效值   'NCName来'。

4 个答案:

答案 0 :(得分:2)

您的XML和XSD需要进行一些更改,包括:

  • <xs:element name="ns2:Response">更改为<xs:element name="Response">,因为元素名称声明必须是 非殖民名称(NCNAME)。
  • 删除<xs:attribute name="xmlns:ns2"... /&gt;因为名称空间 不能声明为属性。
  • 将一个targetNamespace添加到XSD,该文档与XML文档中根元素的名称空间相匹配。
  • 为那些您希望不在命名空间中的元素导入单独的XSD(假设您的根元素位于命名空间中)。您必须使用单独的XSD才能完成此任务。

总而言之,你的XML,

<?xml version="1.0" encoding="UTF-8"?>
<ns2:Response xmlns:ns2="http://test.com/"
              Id="122212">
  <Infos size="1">
    <Info>
      <name>test</name>
    </Info>
  </Infos>
</ns2:Response>

将成功验证这些XSD:

主要

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           attributeFormDefault="unqualified"
           xmlns:ns="http://test.com/"
           targetNamespace="http://test.com/">
  <xs:import schemaLocation="Infos.xsd"/>
  <xs:element name="Response">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="Infos"/>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:int"></xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>

已导入(Infos.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Infos">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Info">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="name" type="xs:string"></xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="size" type="xs:int"></xs:attribute>
    </xs:complexType>
  </xs:element>
</xs:schema>

答案 1 :(得分:0)

我能够获得一个解析文件,如上面的答案所示,将一个目标namepsace添加到模式中,并将ns前缀添加到所有元素。

<?xml version="1.0" encoding="UTF-8"?>
<ns2:Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://test.com testq1.xsd"     xmlns:ns2="http://test.com" Id="122212">
<ns2:Infos size="1">
    <ns2:Info>
        <ns2:name>test</ns2:name>
    </ns2:Info>
</ns2:Infos>

和架构:

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

<xs:element name="Response">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="Infos">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="Info">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="name" type="xs:string"></xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:sequence>
                    <xs:attribute name="size" type="xs:int"></xs:attribute>
                </xs:complexType>
            </xs:element>
        </xs:sequence>

        <xs:attribute name="Id" type="xs:int"></xs:attribute>
    </xs:complexType>
</xs:element>
</xs:schema>

答案 2 :(得分:0)

您可以通过两种方式解决此问题。

方法1 - 多个架构

更典型的方法是为每个使用的命名空间设置一个模式。 所以你最终得到了这样的模式

SampleXml0.xsd

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2017 (https://www.liquid-technologies.com) -->
<xs:schema xmlns:ns2="http://test.com/" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://test.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:import schemaLocation="C:\Temp\StackOverflow\42351409\SampleXml1.xsd" />
  <xs:element name="Response">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" ref="Infos" />
      </xs:sequence>
      <xs:attribute name="Id" type="xs:unsignedInt" use="optional" />
    </xs:complexType>
  </xs:element>
</xs:schema>

enter image description here

SampleXml1.xsd

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid Studio 2017 (https://www.liquid-technologies.com) -->
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Infos">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" name="Info">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" name="name" type="xs:string" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="size" type="xs:unsignedByte" use="optional" />
    </xs:complexType>
  </xs:element>
</xs:schema>

enter image description here

方法2 - 更改elementFormDefault

现在这非常特定于您的示例,但由于它只是使用命名空间限定的根元素,因此可以将elementFormDefault更改为 unqualified 。这会强制在模式中强制定义为根元素的元素具有命名空间限定,而其他元素则不会。

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid Studio 2017 (https://www.liquid-technologies.com)-->
<xs:schema xmlns:ns2="http://test.com/" attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace="http://test.com/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Response">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Infos" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Info" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="name" type="xs:string" minOccurs="0" />
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="size" type="xs:unsignedByte" use="optional" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Id" type="xs:unsignedInt" use="optional" />
        </xs:complexType>
    </xs:element>
</xs:schema>

enter image description here

我可能会建议创建多个模式,因为elementformdefault通常会被客户端实现忽略并被忽略。

答案 3 :(得分:-2)

为什么有三个<xs:sequence>元素?你真的需要吗?你能更好地解释你的代码是如何组织的吗?通常很简单,就像这样:

<xsd:element name="ns2:Response">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="name" type="xs:string" />
            </xsd:sequence>
        </xsd:complexType>
</xsd:element>