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

s4s-att-invalid-value: Invalid attribute value for 'name' in element 'element'

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 Exception: s4s-att-invalid-value: Invalid attribute value for 'name' in element 'element'. Recorded reason: cvc-datatype-valid.1.2.1: 'ns2:Response' is not a valid value for 'NCName'.

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

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

正如上面的答案所暗示的那样,我能够通过向模式添加目标名称空间并向所有元素添加 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>

您的 XML 和 XSD 需要进行多项更改,包括:

  • <xs:element name="ns2:Response"> 更改为 <xs:element name="Response"> 因为元素名称声明必须是 non-colonized 个名称(NCNAME)。
  • 删除 <xs:attribute name="xmlns:ns2".../> 因为命名空间 不能声明为属性。
  • targetNamespace 添加到与 XML 文档中根元素的命名空间相匹配的 XSD。
  • 为那些您希望不在命名空间中的元素导入单独的 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 - 多模式

更典型的方法是为每个使用的名称空间创建一个模式。 所以你最终得到的模式看起来像这样

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\Whosebug351409\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>

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>

方法 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>

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