使用 Java 中的多个命名空间验证 XML
Validate XML with multiple namespace in Java
我正在尝试验证使用多个名称空间的 XML 文档。我想在主命名空间的文档中嵌入辅助命名空间的标签。 main/primary 命名空间不是 extension/secondary 命名空间的 "know"。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<book
xmlns ="MyMain_FPI"
xmlns:ns2="MyExtension_FPI"
>
<ns2:playmusic/>
<chapter/>
<chapter/>
</book>
验证的Java代码如下:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new Source[] {
new StreamSource(new FileInputStream("main.xsd")),
new StreamSource(new FileInputStream("extension.xsd")),
});
factory.setSchema(schema);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("test.xml"));
如您所见,我直接将 XSD 文件添加到 DocumentBuilderFactory。
这些文件是:
main.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="chapter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="chapter">
<xs:complexType/>
</xs:element>
</xs:schema>
extension.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyExtension_FPI"
targetNamespace="MyExtension_FPI"
elementFormDefault="qualified">
<xs:element name="playmusic">
</xs:element>
</xs:schema>
我在执行上面的代码时得到的错误是
[Error] test.xml:6:18: cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element 'ns2:playmusic' gefunden. '{"MyMain_FPI":chapter}' wird erwartet.
意思是,这在主命名空间中是意外的——这是可以理解的,因为元素本身在该命名空间中是未知的。我希望在主命名空间再次验证文档时忽略扩展命名空间的元素,反之亦然 - 这意味着我可以在主命名空间中的扩展命名空间之后嵌入文档。但这显然是行不通的。
我错过了什么?
您的 main.xsd
在 book
元素允许的范围内是明确的。如果您想允许任何其他元素,则需要在 main.xsd
中说明。之后您可以添加任何您想要的扩展 XSD。参见 https://www.w3.org/TR/xmlschema-0/#any。
新main.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" />
<xs:element maxOccurs="unbounded" ref="chapter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="chapter">
<xs:complexType/>
</xs:element>
</xs:schema>
我正在尝试验证使用多个名称空间的 XML 文档。我想在主命名空间的文档中嵌入辅助命名空间的标签。 main/primary 命名空间不是 extension/secondary 命名空间的 "know"。
test.xml
<?xml version="1.0" encoding="UTF-8"?>
<book
xmlns ="MyMain_FPI"
xmlns:ns2="MyExtension_FPI"
>
<ns2:playmusic/>
<chapter/>
<chapter/>
</book>
验证的Java代码如下:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new Source[] {
new StreamSource(new FileInputStream("main.xsd")),
new StreamSource(new FileInputStream("extension.xsd")),
});
factory.setSchema(schema);
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(new File("test.xml"));
如您所见,我直接将 XSD 文件添加到 DocumentBuilderFactory。 这些文件是:
main.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" ref="chapter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="chapter">
<xs:complexType/>
</xs:element>
</xs:schema>
extension.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyExtension_FPI"
targetNamespace="MyExtension_FPI"
elementFormDefault="qualified">
<xs:element name="playmusic">
</xs:element>
</xs:schema>
我在执行上面的代码时得到的错误是
[Error] test.xml:6:18: cvc-complex-type.2.4.a: Ungültiger Content wurde beginnend mit Element 'ns2:playmusic' gefunden. '{"MyMain_FPI":chapter}' wird erwartet.
意思是,这在主命名空间中是意外的——这是可以理解的,因为元素本身在该命名空间中是未知的。我希望在主命名空间再次验证文档时忽略扩展命名空间的元素,反之亦然 - 这意味着我可以在主命名空间中的扩展命名空间之后嵌入文档。但这显然是行不通的。
我错过了什么?
您的 main.xsd
在 book
元素允许的范围内是明确的。如果您想允许任何其他元素,则需要在 main.xsd
中说明。之后您可以添加任何您想要的扩展 XSD。参见 https://www.w3.org/TR/xmlschema-0/#any。
新main.xsd
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="MyMain_FPI"
targetNamespace="MyMain_FPI"
elementFormDefault="qualified">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" />
<xs:element maxOccurs="unbounded" ref="chapter"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="chapter">
<xs:complexType/>
</xs:element>
</xs:schema>