gpt4 book ai didi

java - 无法通过代码找到简单模式验证的元素错误声明

转载 作者:行者123 更新时间:2023-12-01 19:35:24 24 4
gpt4 key购买 nike

我在使用 javax.xml.validation.Schema 进行 XML 验证时遇到问题。

我有一个架构分为两个文件。第一个:

<xs:schema targetNamespace="http://sample/AAA/1.0.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:complexType name="BBB">
<xs:attribute name="firstName" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="lastName" use="optional">
<xs:simpleType>
<xs:restriction base="xs:string">
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:schema>

第二个:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://sample/AAA/1.0.xsd" xmlns="http://sample/AAA/1.0.xsd" version="0"
xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:include schemaLocation="BBB1.xsd"/>
<xs:element name="AAA">
<xs:annotation>
<xs:documentation xml:lang="en">Root element.</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="BBB" type="BBB"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

然后我有一个要验证的示例 XML 文件:

<AAA xmlns="http://sample/AAA/1.0.xsd">
<BBB firstName="string" lastName="string"/>
</AAA>

我创建一个 Schema 实例,如下所示:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI, SAX_PARSER_FACTORY, null);
factory.setResourceResolver(new SchemeXsdResolver());
Schema schema = factory.newSchema(xsdStreamSource);

xsdStreamSource 是一个包含两个 StreamSource(每个 XSD 文件一个)的数组。然后我尝试使用代码验证示例 XML:

SAXParserFactory parserFactory = SAXParserFactory.newInstance(SAX_PARSER_FACTORY_CLASS, null);
parserFactory.setNamespaceAware(true);
parserFactory.setSchema(schema);

SAXParser saxParser = parserFactory.newSAXParser();
SchemaValidatorErrorHandler errorHandler = new SchemaValidatorErrorHandler();
errorHandler.setLines(new String(content, "UTF-8").split("\\n"));
saxParser.parse(new BOMInputStream(new ByteArrayInputStream(content)), errorHandler);

但是,errorHandler 报告错误:

/AAA[1] [cvc-elt.1.a: Cannot find the declaration of element 'AAA'.].

最佳答案

为了从多个文件加载具有相同命名空间的模式,我们必须在创建模式时启用附加功能。

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI, SAX_PARSER_FACTORY, null);
factory.setFeature(Constants.XERCES_FEATURE_PREFIX + Constants.NAMESPACE_GROWTH_FEATURE, true);
factory.setResourceResolver(new SchemeXsdResolver());
return factory.newSchema(schemas);

否则,仅加载具有此命名空间的第一个文件,并跳过第二个文件。

关于java - 无法通过代码找到简单模式验证的元素错误声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59226742/

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