在Java中验证时从XML获取架构信息

问题描述:

我需要根据XML架构验证XML文件,以便从XML中获取架构信息。在Java中验证时从XML获取架构信息

我有定义其名称空间的XML文档。就像这样:

<?xml version="1.0" encoding="UTF-8"?> 
<myelement xmlns="mynamespace"> 

</myelement> 

模式位置不是文档中所以我需要告诉验证哪里是在给定的命名空间的架构。现在我做了以下方法:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder parser = dbf.newDocumentBuilder(); 
Document document = parser.parse(new File("mydocument.xml")); 
String namespace = document.getChildNodes().item(0).getNamespaceURI(); 
SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source schemaFile = new StreamSource(new File(namespace + ".xsd")); 
Schema schema = factory.newSchema(schemaFile); 
Validator validator = schema.newValidator(); 
validator.setErrorHandler(new MyErrorHandler()); 
validator.validate(new DOMSource(document)); 

这样,它的工作原理,但它有两个问题:

1)它是一种笨拙的,我必须手动首先解析文档和创建模式尽管理论上验证者拥有所有需要自动完成的信息。 2)如果我验证Document对象,我不会得到错误的正确行数。为了得到正确的行号,我必须分析两次相同的文档(首先要获取名称空间,然后再次验证)。

有没有人知道更好的解决方案?

解析之前,有没有办法告诉解析器namespace1对应schema1.xsd,namespace2 to schema2.xsd等?或者,我可以编写某种回调,解析器可以用来询问模式(例如,我可以将LSResourceResolver提供给SchemaFactory)?

目前,由于架构不可用(解析器甚至未配置为验证您的文档),您的解析器无法根据架构验证文档。为了自动实现这一点,我认为有两个选择:

  1. 编辑XML包含的xsi:schemaLocation属性(不知道这是在支持的所有虽然)

  2. 为您的名称空间注册模式:

代码:

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Source schemaFile = new StreamSource(new File(namespace + ".xsd")); 
Schema schema = factory.newSchema(schemaFile); 

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
dbf.setValidating(true); 
dbf.setSchema(schema); 
+0

1.可以得到它的工作,如果schemaLocation属性存在,但在我的情况是不存在的,我不能强迫使用这个属性。只有在给定名称空间时,我必须能够验证文档。 2.这种方式可行,但这是我的问题。在我窥视XML文档之前,我不知道要使用哪个模式。 我正在寻找的是一种方法来告诉解析器,命名空间1对应于schema1.xsd,namespace2对schema2.xsd等在解析之前或一个选项来编写某种类型的回调,解析器可以用来询问模式。 – martsraits 2009-10-22 16:50:32