Java 如何验证具有重复子元素的xml作为Id唯一的标记?

Java 如何验证具有重复子元素的xml作为Id唯一的标记?,java,xml,validation,xsd,Java,Xml,Validation,Xsd,我有以下格式的xml: <data> <index id="Name">Mesut</index> <index id="Age">28</index> </data> 运行上述代码的例外情况如下: <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="data"> <

我有以下格式的xml:

<data>
   <index id="Name">Mesut</index>
   <index id="Age">28</index>
</data>
运行上述代码的例外情况如下:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="data">
          <xs:complexType>
                 <xs:sequence>
                        <xs:element name="index" maxOccurs="unbounded" type="xs:string">
                               <xs:complexType>
                                      <xs:attribute name="id" type="xs:string"></xs:attribute>                                                            
                                </xs:complexType>                   
                        </xs:element>
                    </xs:sequence>
           </xs:complexType>
</xs:element>
    public static void main(String[] args){
    boolean b = true;
    File fXml = new File("C:\\Users\\Mesut\\Desktop\\XMLAndXSD\\MainXml.xml");
    File fXsd = new File("C:\\Users\\Mesut\\Desktop\\XMLAndXSD\\MainXml.xsd");
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    try {           
        Schema schema = schemaFactory.newSchema(fXsd);
        schema.newValidator().validate(new StreamSource(fXml));
    } catch(SAXException sax) {         
        System.out.println("exception in sax");
        b = false;
        sax.printStackTrace();
    } catch(IOException io) {
        System.out.println("exception in io");
        b = false;
        io.printStackTrace();
    }       
    System.out.println(b);}
enter code hereorg.xml.sax.SAXParseException; systemId: file:/C:/Users/Vikas/Desktop/XMLAndXSD/MainXml.xsd; lineNumber: 6; columnNumber: 93; src-element.3: Element 'index' has both a 'type' attribute and a 'anonymous type' child. Only one of these is allowed for an element.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:134)
使用标记创建一个新类型,该类型扩展xs:string以包含属性id。在架构位置的开头:

<xs:complexType name="indexType">
   <xs:simpleContent>
     <xs:extension base="xs:string">
       <xs:attribute name="id" type="xs:string"/>
     </xs:extension>
   </xs:simpleContent>
</xs:complexType>

然后在“数据”中执行以下操作:


基于@mascoj的答案,尝试以下模式:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://myns">
  <xs:element name="data">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="index" maxOccurs="unbounded" minOccurs="0">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="id" use="optional"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

这将验证以下xml实例:

<f:data xmlns:f="http://myns">
   <f:index id="Name">Mesut</f:index>
   <f:index id="Age">28</f:index>
</f:data>

梅苏特
28

你能详细说明一下吗?嗯,我可以试试,但基本上都有。扩展标记允许您基于现有的模式类型(在本例中为xs:string)定义新类型。我的示例创建了类型“indexType”,然后可以将其用作“index”元素标记的类型。如果您需要更多信息,请按照我的答案中的链接访问W3Schools网页。它是通用标记语言的良好资源您的模式在其当前形式下无效。您不能在已定义的级别定义属性。@Tom Redfern。我从1+个在线网站生成了这个xsd。生成xsd的地方都是一样的。你能帮我找到正确的吗。请
<f:data xmlns:f="http://myns">
   <f:index id="Name">Mesut</f:index>
   <f:index id="Age">28</f:index>
</f:data>