2013-09-05 60 views
3

我正在嘗試編寫一個單元測試,它將根據XSD驗證XML字符串文檔。請注意,XSD存儲在磁盤上,用於XML文檔中名稱空間的URL實際上並不通過Web服務器可用。麻煩根據XSD驗證XML(java)

下面是代碼:

@Test 
public void testValidateAgainstXSD() throws Exception { 
    String xmlDoc = MY_XML_DOC_SAMPLE; 
    File schemaFile = new File("/Users/philswenson/dev/optimize_l/modules/ae/staging/eda-eventtypes/Analysis/1.0/MeasurementResultStatistics.xsd"); 

    Source xmlFile = new StreamSource(xmlDoc); 
    SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
    Schema schema = schemaFactory.newSchema(schemaFile); 
    Validator validator = schema.newValidator(); 
    try { 
     validator.validate(xmlFile); 
     System.out.println(xmlFile.getSystemId() + " is valid"); 
    } catch (SAXException e) { 
     throw new RuntimeException(e); 
    } 
} 

當我運行測試,我得到下面的錯誤。關於我在做什麼的任何想法都是錯誤的?

java.net.MalformedURLException: no protocol: <?xml version="1.0" encoding="utf-8"?> 
<p:MeasurementResultStatistics xmlns:p="http://namespaces.myco.com/EDA/Analysis/1.0"> <p:Average>5.0</p:Average> 
    <p:Minimum>0.1</p:Minimum> 
    <p:Maximum>10.3</p:Maximum> 
    <p:StandardDeviation>0.0</p:StandardDeviation> 
    <p:HourOfDay>7</p:HourOfDay> 
    <p:DayOfWeek>Mon</p:DayOfWeek> 
<p2:MeasurementDefinition xmlns:p2="http://namespaces.myco.com/EDA/Analysis/1.0"> 
<p2:Name>TEST KPI NAME</p2:Name> 
<p2:DisplayName>TEST DISPLAY NAME</p2:DisplayName> 
<p2:Version>1</p2:Version> 
<p2:MeasurementUnits>TEST UOM</p2:MeasurementUnits> 
<p2:TimeInterval>10000</p2:TimeInterval> 
</p2:MeasurementDefinition> 
<p3:MeasurementMember xmlns:p3="http://namespaces.myco.com/EDA/Analysis/1.0"> 
<p3:Name>TEST MONITOR STRING ID</p3:Name> 
<p3:DisplayName>TEST DISPLAY NAME</p3:DisplayName> 
</p3:MeasurementMember> 
</p:MeasurementResultStatistics> 
    at java.net.URL.<init>(URL.java:567) 
    at java.net.URL.<init>(URL.java:464) 
    at java.net.URL.<init>(URL.java:413) 
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source) 
    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) 
    at org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate(Unknown Source) 
    at org.apache.xerces.jaxp.validation.ValidatorImpl.validate(Unknown Source) 
    at javax.xml.validation.Validator.validate(Validator.java:127) 
    at com.myco.optimize.monitor.engine.XSDValidatorTest.testValidateAgainstXSD(XSDValidatorTest.java:46) 
+0

問題是什麼?你看到一些例外嗎? –

+0

AFIK沒有必要讓xsd文件可以通過該域訪問。解析器只有該文件的副本纔是重要的。 – rekire

+0

抱歉,未完成發佈。我的問題現在完成:) –

回答

11

問題是這一行代碼:

Source xmlFile = new StreamSource(xmlDoc); 

正如我們在the documentation看到,StreamSource的構造函數採用字符串參數的URL,而不是XML內容。因此,它試圖將您的XML解釋爲URL,並不奇怪,XML不是以有效的協議(如「http:」)開頭的。

的解決方案是使用的StreamSource(閱讀器)的構造來代替:

Source xmlFile = new StreamSource(new StringReader(xmlDoc)); 
+0

現在的錯誤非常有意義....這就是爲什麼我需要另一套眼睛。謝謝! –