gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:56:31 27 4
gpt4 key购买 nike

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

测试.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 元素,但 ss 元素也未在 XSD 中定义。如何获取 XSD 中缺失的所有元素的列表,反之亦然?

最佳答案

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

您可以尝试将解析器配置为在遇到错误后继续。例如,Xerces2-J 有一个 http://apache.org/xml/features/continue-after-fatal-error feature这将尝试在发生 fatal error 后继续解析。您可能应该注意他们的警告,但是

The behavior of the parser when this feature is set to true is undetermined! Therefore use this feature with extreme caution because the parser may get stuck in an infinite loop or worse.

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

  • 元素外观而不是位置/使用是否才是最重要的?
  • 您是否必须处理 XSD 中的 xs:importxs:include 语句?
  • 您可以使用 XSLT,还是必须使用 SAX 或其他方式来构建和比较元素列表?

最后,如果您的实际目标只是使 XML 文档根据 XSD 有效,通常的周期是修复遇到的每个错误并重新验证。在实践中,以这种方式操作时,预先没有完整的错误集不会成为问题。

关于java - 如何获取 XSD 文件中未定义的所有 XML 元素的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20070913/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com