如何通过https URL针对XSD验证XML文件?

时间:2013-01-11 00:13:58

标签: java xml validation https xsd

我想使用位于安全https站点的架构验证XML文件。除了自签名证书或使用https URL之外,如何告知验证者?我有一个名为test.xml的文件和一个位于https://localhost:1234/module/testschema.xsd的模式。我使用了here找到的相同代码。如果我使用常规网址(http://localhost/module/testschema.xsd),则效果很好。如果我用https URL替换,那么我会收到此错误:

schema_reference.4:无法读取架构文档“https://localhost:1234/module/testschema.xsd”,因为1)找不到该文档; 2)文件无法阅读; 3)文档的根元素不是<xsd:schema>

复制代码:

public boolean validateFile(String xml, String strSchemaLocation)
{
Source xmlFile = null;
try {
    URL schemaFile = new URL(strSchemaLocation);
    xmlFile = new StreamSource(new File(xml));
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    Schema schema = schemaFactory.newSchema(schemaFile);
    Validator validator = schema.newValidator();
    validator.validate(xmlFile);
    System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
    System.out.println(xmlFile.getSystemId() + " is NOT valid");
    System.out.println("Reason: " + e.getLocalizedMessage());
    return false;
} catch (IOException ioe) {
    System.out.println("IOException");
    return false;
}

return true;
}

2 个答案:

答案 0 :(得分:1)

这与架构验证几乎没有关系。您的问题是您需要建立HTTPS连接并信任自签名证书。请参阅How can I use different certificates on specific connections?或谷歌。

我认为你不能使用带有File的SchemaFactory.newSchema工厂方法,所以只需使用带有StreamSource的方法:

URL schemaFile = new URL(strSchemaLocation);
HttpsURLConnection schemaConn = (HttpsURLConnection)schemaFile.openConnection();
// Magic from the other answer to accept self-signed cert
InputStream is = schemaConn.getInputStream();
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema = schemaFactory.newSchema(new StreamSource(is));

(我正在省略try..catch以关闭输入流和连接)

答案 1 :(得分:0)

这不是验证问题,java.net.URL支持https,应该有bo差异。只需确保您可以使用浏览器打开https://localhost:1234/module/testschema.xsd