簡體   English   中英

無法通過代碼找到簡單模式驗證的元素錯誤聲明

[英]Cannot find the declaration of element error for simple schema validation via code

我在使用 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:找不到元素“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);

否則,只會加載具有此命名空間的第一個文件,而跳過第二個文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM