2009-10-22 35 views
0

我需要根據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)?

回答

0

目前,由於架構不可用(解析器甚至未配置爲驗證您的文檔),您的解析器無法根據架構驗證文檔。爲了自動實現這一點,我認爲有兩個選擇:

  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