【问题标题】:Validate XML(gpx) schema with SAXParser offline使用 SAXParser 离线验证 XML(gpx) 模式
【发布时间】:2012-02-07 04:21:42
【问题描述】:

我正在使用以下代码根据指定的 XML 架构验证 XML 文档 (.gpx)。我在本地将架构存储为 .xsd 文件。问题在于,此方法使用 Internet 连接来验证架构。有没有办法在不使用互联网连接的情况下做到这一点? (考虑到我在本地存储 XML 模式)。

代码:

    public static boolean validate(String XmlDocumentUrl, String SchemaUrl) {
    SAXParser parser = new SAXParser();
    try {
        parser.setFeature("http://xml.org/sax/features/namespaces", true);

        parser.setFeature("http://xml.org/sax/features/validation", true);
        parser.setFeature(
                "http://apache.org/xml/features/validation/schema", true);
        parser.setFeature(
                "http://apache.org/xml/features/validation/schema-full-checking",
                false);
        parser.setProperty(
                "http://apache.org/xml/properties/schema/external-schemaLocation",
                SchemaUrl);
        Validator handler = new Validator();

        parser.setErrorHandler(handler);
        parser.parse(XmlDocumentUrl);
        if (handler.validationError == true){
            System.out.println("XML Document has Error:"

                    + handler.validationError + ""
                    + handler.saxParseException.getMessage());
        return false;
        }
        else{
            System.out.println("XML Document is valid");
        return true;
        }
    } catch (java.io.IOException ioe) {
        System.out.println("IOException" + ioe.getMessage());
    } catch (SAXException e) {
        System.out.println("SAXException" + e.getMessage());
    }
    return false;
}

感谢和问候,

佩塔

【问题讨论】:

    标签: java xsd validation offline gpx


    【解决方案1】:

    使用“file://”网址来引用您的本地架构。

    【讨论】:

      【解决方案2】:

      schemaUrl 指定为"file://path/to/schema.xsd"

      【讨论】:

      • 感谢您的回答。但是,当我使用这个时: parser.setProperty("apache.org/xml/properties/schema/external-schemaLocation", "file://"+SchemaUrl);问题仍然存在。当我离线时它会返回错误
      • 不,它只是一个包含模式名称(和路径)的字符串。因此,通过在前面添加“file://”,它应该变成“file://schema.xsd”。我在这里错过了什么?
      【解决方案3】:

      你可以传递你自己的 DefaultHandler 实现:

      ...SAXParserFactory factory = SAXParserFactory.newInstance();
      SAXParser saxParser = factory.newSAXParser();
      saxParser.parse(InputSource, new Defaulthandler() {
      @Override
                  public InputSource resolveEntity(String publicId, String systemId)
                          throws IOException, SAXException {
                      InputStream is = ClassLoader.getSystemResourceAsStream("path_to_you_local_dtd_doc");
                      return is != null ? new InputSource(is) :
                          super.resolveEntity(publicId, systemId);
                  }
      } )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        • 2011-06-02
        • 2010-11-22
        • 2013-05-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多