首页  >  文章  >  使用作为文件加载的 XSD 进行 XML 验证与输入流

使用作为文件加载的 XSD 进行 XML 验证与输入流

WBOY
WBOY转载
2024-02-09 15:09:09998浏览

在php小编草莓的指导下,我们将探讨使用作为文件加载的XSD进行XML验证与输入流的方法。当我们处理XML数据时,验证是非常重要的一步,以确保数据的正确性和完整性。通过使用XSD(XML Schema Definition)文件,我们可以定义XML文档的结构和约束。通过加载XSD文件并将其用于验证输入的XML流,我们可以轻松地检测和处理不符合规定的数据,从而提高应用程序的可靠性和安全性。接下来,我们将详细介绍如何使用XSD文件进行XML验证和输入流处理。

问题内容

如果 xsd 作为文件或资源加载,我在 xml 验证中会遇到不同的行为。

如果我将 xsd 作为文件加载,一切都很好并且验证工作正常:

schemafactory sf = schemafactory.newinstance(xmlconstants.w3c_xml_schema_ns_uri);
schema schema = sf.newschema(new classpathresource("my/perfect/path/myfile.xsd").getfile());
validator validator = schema.newvalidator();
validator.validate(sourcetovalidate);

相反,因为我决定将 xsd 文件包含到 jar 中,所以我将其作为资源加载,但行为不同,当我构造架构时,我陷入 saxparseexception ,并且错误抱怨中的某些问题将 xsd 文件中的名称解析为类型定义。 xsd 文件绝对正确

SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("my/perfect/path/myFile.xsd");
Source schemaSource = new StreamSource(inputStream);
Schema schema = sf.newSchema(schemaSource); // here i get the SAXParseException
Validator validator = schema.newValidator();
validator.validate(sourceToValidate);

我真的不明白为什么加载 xsd 作为 resourceasstream 会导致不同的行为

我使用 jaxb 进行 xml 验证

解决方法

我猜测您的 xsd 引用了其他 xsd,并且您的验证器不知道如何解析这些引用。

您可能需要提供 lsresourceresolvervalidator

classloader loader = getclass().getclassloader();
lsresourceresolver resolver = new lsresourceresolver() {
   public lsinput resolveresource(string type, string namespaceuri, string publicid, string systemid, string baseuri) {
      inputstream stream = loader.getresourceasstream(systemid);
      if (stream == null) throw new runtimeexception("could not find " + systemid);
      lsinput input = new dominputimpl();
      input.setpublicid(publicid);
      input.setsystemid(systemid);
      input.setbaseuri(baseuri);
      input.setbytestream(stream);             
      return input;
   }
};
validator validator = schema.newvalidator();
validator.setresourceresolver(resolver);

您还需要通过调用 streamsource 的两个参数构造函数来在 inputsource 上设置 systemid

String xsdPath = "my/perfect/path/myFile.xsd";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(xsdPath);
Source schemaSource = new StreamSource(inputStream, xsdPath);

请参阅streamsource(inputstream, string)

以上是使用作为文件加载的 XSD 进行 XML 验证与输入流的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除