![](/img/trans.png)
[英]Reading an XSD file to get all the elements and corresponding attributes in Java
[英]How to get list of all XML elements that are not defined in XSD file
我有一个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>
DummyXSD.xml
<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>
Java代码:
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.
如何获得XSD文件中未定义的所有元素?
此示例输出仅显示aa
元素,但在XSD中也未定义ss
元素。 如何获得XSD中缺少的所有元素的列表,反之亦然?
要确定XML文档中未出现在XSD中的所有元素 ,您的计划是利用验证。 尽管乍看之下这似乎是一种合理的方法,但麻烦在于,随着遇到每个错误,尝试从解析错误中恢复将变得越来越复杂。 因此,默认设置是在第一个严重错误后暂停。
您可能会尝试将解析器配置为在遇到错误后继续运行。 例如,Xerces2-J具有http://apache.org/xml/features/continue-after-fatal-error功能 ,该功能将在发生致命错误后尝试继续解析。 您可能应该注意他们的警告,但是
当此功能设置为true时,解析器的行为尚未确定 ! 因此,请谨慎使用此功能,因为解析器可能陷入无限循环甚至更糟。
重新检查需求和方法可能很有意义。 如果仅需要比较原始元素列表,则可以通过分别解析XML文档(对于元素)和XSD(对于xs:element/@name
属性),然后比较列表来创建此类列表。 您的要求在这里发挥了作用。 例如,这里仅是几个要考虑的问题:
xs:import
和xs:include
语句? 最后,如果您的实际目标只是根据XSD使XML文档有效,那么通常的周期将是修复遇到的每个错误并重新验证 。 实际上,以这种方式操作时,预先没有一整套错误就不会成为问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.