gpt4 book ai didi

java - 针对具有相同命名空间的两个模式验证 Java 中的 XML 文件

转载 作者:行者123 更新时间:2023-11-30 09:50:33 26 4
gpt4 key购买 nike

我有

  1. 一个 XML 文档,
  2. 基本 XSD 文件和
  3. 扩展的 XSD 文件。

两个 XSD 文件都有一个命名空间。

文件 3) 包括文件 2):<xs:include schemaLocation="someschema.xsd"></xs:include>

XML 文档(文件 1)具有以下根标记:

<tagDefinedInSchema xmlns="http://myurl.com/myapp/myschema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://myurl.com/myapp/myschema schemaFile2.xsd">

哪里schemaFile2.xsd就是上面的文件3。

我需要根据两种模式验证文件 1,没有

  1. 修改文件本身和

  2. 将两个模式合并到一个文件中。

我如何在 Java 中执行此操作?

UPD:这是我正在使用的代码。

SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
DocumentBuilderFactory documentFactory = DocumentBuilderFactory
.newInstance();
documentFactory.setNamespaceAware(namespaceAware);
DocumentBuilder builder = documentFactory.newDocumentBuilder();
Document document = builder.parse(new ByteArrayInputStream(xmlData
.getBytes("UTF-8")));

File schemaLocation = new File(schemaFileName);
Schema schema = schemaFactory.newSchema(schemaLocation);

Validator validator = schema.newValidator();

Source source = new DOMSource(document);

validator.validate(source);

UPD 2:这对我有用:

    public static void validate(final String xmlData,
final String schemaFileName, final boolean namespaceAware)
throws SAXException, IOException {
final SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
schemaFactory.setResourceResolver(new MySchemaResolver());
final Schema schema = schemaFactory.newSchema();

final Validator validator = schema.newValidator();
validator.setResourceResolver(schemaFactory.getResourceResolver());

final InputSource is = new InputSource(new ByteArrayInputStream(xmlData
.getBytes("UTF-8")));
validator.validate(new SAXSource(is), new SAXResult(new XMLReaderAdapter()));
}



class MySchemaResolver implements LSResourceResolver {

@Override
public LSInput resolveResource(final String type,
final String namespaceURI, final String publicId, String systemId,
final String baseURI) {
final LSInput input = new DOMInputImpl();
try {
if (systemId == null) {
systemId = SCHEMA1;
}
FileInputStream fis = new FileInputStream(
new File("path_to_schema_directory/" + systemId));

input.setByteStream(fis);
return input;
} catch (FileNotFoundException ex) {
LOGGER.error("File Not found", ex);
return null;
}

}

最佳答案

一点术语:这里有一个模式,它是从两个模式文档构建的。

如果在构建架构时向 API 指定 schemaFile2.xsd,它应该会通过 xs:include 自动拉入其他文档。如果您怀疑这没有发生,您需要解释是什么症状让您相信这一点。

关于java - 针对具有相同命名空间的两个模式验证 Java 中的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5104650/

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