Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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 如何获取XSD文件中未定义的所有XML元素的列表_Java_Xml_Validation_Xml Parsing_Xsd - Fatal编程技术网

Java 如何获取XSD文件中未定义的所有XML元素的列表

Java 如何获取XSD文件中未定义的所有XML元素的列表,java,xml,validation,xml-parsing,xsd,Java,Xml,Validation,Xml Parsing,Xsd,我有一个XML和XSD文件,正在使用SAX解析器验证XML文件。 我想找到所有未在XSD文件中定义的XML元素的列表,反之亦然 Test.xml <Records> <Record> <VendorID>Velos</VendorID> <PatID>M004</PatID> <aa></aa> <PatLName>

我有一个XML和XSD文件,正在使用SAX解析器验证XML文件。
我想找到所有未在XSD文件中定义的XML元素的列表,反之亦然

Test.xml

<Records>
    <Record>
        <VendorID>Velos</VendorID>

        <PatID>M004</PatID>
        <aa></aa>
        <PatLName>LName2</PatLName>        
        <DOB>12/06/1902</DOB>
        <RecordID>R004</RecordID>   
        <ss></ss>
    </Record>
</Records>
<xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema'
           xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
  <xs:element name="Records">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Record" type='recordType'/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>   

  <xs:complexType name="recordType">
    <xs:sequence>
      <xs:element name="VendorID"  type='xs:string'/>
      <xs:element name="PatID"     type='xs:string'/>      
      <xs:element name="PatLName"  type='xs:string'/>  
      <xs:element name="haveToInXml"  type='xs:string'/> 
    </xs:sequence> 
  </xs:complexType>   
</xs:schema>
如何获取XSD文件中未定义的所有元素


此示例输出仅显示
aa
元素,但是
ss
元素也未在XSD中定义。如何获取XSD中缺少的所有元素的列表,反之亦然?

要确定XML文档中没有出现在XSD中的所有元素,您的计划是利用验证。虽然一开始这似乎是一种合理的方法,但问题在于,当遇到每个错误时,试图从解析错误中恢复变得越来越复杂。因此,默认设置是在第一个严重错误后停止

您可以尝试在遇到错误后将解析器配置为继续。例如,Xerces2-J具有一个将在发生致命错误后尝试继续解析的。你可能应该注意他们的警告,但是

当此特性设置为true时,解析器的行为为 待定!因此,请非常小心地使用此功能,因为解析器可能陷入无限循环或更糟的情况

重新检查需求和方法可能是有意义的。如果只需要比较元素的原始列表,也许您可以通过分别解析XML文档(对于元素)和XSD(对于
xs:element/@name
属性),然后比较列表来创建这样的列表。不过,您的要求在这里起作用。例如,这里只有几个问题需要考虑:

  • 重要的是元素外观而不是位置/用途吗
  • 您是否必须在XSD中处理
    xs:import
    xs:include
    语句
  • 您可以使用XSLT,或者必须使用SAX或其他方法来构建和比较元素列表吗
最后,如果您的实际目标只是根据XSD使XML文档有效,那么通常的循环是修复遇到的每个错误并重新验证。在实践中,在以这种方式操作时,预先没有一整套错误不会成为问题

public class XmlValidator {
 public static void main(String [] args) throws Exception{
     try{   
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Source schemaFile = new StreamSource(new File("E:/Paw/Dendrite/Dendritep/TestData/dummyXSD.xsd"));
        Schema schema = factory.newSchema(schemaFile);

        //using SAX Parser
        final SAXParserFactory saxFactory = SAXParserFactory.newInstance();
        saxFactory.setNamespaceAware(true);
        saxFactory.setSchema(schema);           
        final SAXParser saxParser = saxFactory.newSAXParser();          
        CustomErrorHandler errorHandler =new CustomErrorHandler();                              
            saxParser.parse(new File("E:/Paw/Dendrite/Dendritep/TestData/Test.xml"), errorHandler); 
     }catch(SAXParseException e){
        System.out.println("in catch"); 
        System.out.println(e.getLineNumber() +"   "+e.getColumnNumber());
        System.out.println(e);
    } 
    catch (Exception e){
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println(e);
    }
}
}
public class CustomErrorHandler extends DefaultHandler{
    final List<SAXParseException> exceptions = new LinkedList<SAXParseException>();
    @Override
    public void error(SAXParseException e){ 
        System.out.println("In error");    
        exceptions.add(e);
        String err = e.toString();
        System.out.println(e);          
    }   
}
org.xml.sax.SAXParseException; systemId: file:/C:/Documents%20and%20Settings/Rakesh%20Kumar/Desktop/Stack/Test.xml; lineNumber: 7; columnNumber: 7; cvc-complex-type.2.4.a: Invalid content was found starting with element 'aa'. One of '{PatLName}' is expected.