背景:从另一个系统使用XML。解析,验证并持久保存到自己的数据库中。
由于并非所有字段都与我的系统相关,因此仅对某些元素类型进行模式验证。如果验证失败,请终止执行。
即使验证失败,仍要保留其他类型,
我正在针对XSD列表(一个主要XSD包含多个XSD)验证XML。 当前在我的代码中,验证程序正在检查是否与所有随附的XSD保持一致。
但是,要求是-必须对某些XSD强制进行 模式验证。对于其他一些情况,即使XML元素类型不符合XSD类型,也不要失败。 如何做到这一点?
例如说,Person.xsd和Product.xsd是强制进行架构验证的。可以忽略Address.xsd和Phone.xsd中的验证。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="com.demo.devika" xmlns:tns="com.demo.devika" elementFormDefault="qualified">
<xsd:include schemaLocation="Address.xsd" />
<xsd:include schemaLocation="Phone.xsd" />
<xsd:include schemaLocation="Product.xsd" />
<xsd:element name="Person" type="tns:Person_Type"/>
<xsd:complexType name="Person_Type">
<xsd:sequence>
<xsd:element name="FirstName" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="LastName" type="xsd:string" minOccurs="1" maxOccurs="1"/>
<xsd:element name="Address" type="tns:Address_Type" minOccurs="1" maxOccurs="unbounded"/>
<xsd:element name="Phone" type="tns:Phone_Type" minOccurs="0" maxOccurs="unbounded"/>
<xsd:element name="Product" type="tns:Product_Type" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema>
XML验证方法
public boolean execute(InputStream inputXML) throws XMLStreamException, SAXException, IOException {
// Creating Source array for Schema
List<Source> schemaSources = schemaFiles.stream().map(schemaFile -> new StreamSource(schemaFile))
.collect(Collectors.toCollection(ArrayList::new));
try {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACE_GROWTH_FEATURE,
Boolean.TRUE);
Schema schemaGrammar = schemaFactory
.newSchema(schemaSources.toArray(new StreamSource[schemaSources.size()]));
Validator schemaValidator = schemaGrammar.newValidator();
schemaValidator.validate(new StreamSource(inputXML));
return true;
} catch (SAXException | IOException ex) {
throw ex;
} finally {
inputXML.close();
}
}