根据XSD(java)验证XML时遇到的问题

根据XSD(java)验证XML时遇到的问题,java,xml,xsd,Java,Xml,Xsd,我正在尝试编写一个单元测试,它将根据XSD验证XML字符串文档。请注意,XSD存储在磁盘上,XML文档中用于名称空间的URL实际上无法通过web服务器使用 代码如下: @Test public void testValidateAgainstXSD() throws Exception { String xmlDoc = MY_XML_DOC_SAMPLE; File schemaFile = new File("/Users/philswenson/dev/optimize_

我正在尝试编写一个单元测试,它将根据XSD验证XML字符串文档。请注意,XSD存储在磁盘上,XML文档中用于名称空间的URL实际上无法通过web服务器使用

代码如下:

 @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)
java.net.MalformedURLException:无协议:
5
0.1
10.3
0
7.
周一
测试KPI名称
测试显示名称
1.
测试计量单位
10000
测试监视器字符串ID
测试显示名称
位于java.net.URL。(URL.java:567)
在java.net.URL.(URL.java:464)
在java.net.URL.(URL.java:413)
位于org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(未知源)
位于org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(未知源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.parsers.XML11Configuration.parse(未知源)
位于org.apache.xerces.jaxp.validation.StreamValidatorHelper.validate(未知源)
位于org.apache.xerces.jaxp.validation.ValidatorImpl.validate(未知源)
位于javax.xml.validation.Validator.validate(Validator.java:127)
在com.myco.optimize.monitor.engine.XSDValidatorTest.testValidateAgainstXSD(XSDValidatorTest.java:46)

问题在于代码中的这一行:

Source xmlFile = new StreamSource(xmlDoc);
如中所示,StreamSource构造函数假定字符串参数是URL,而不是XML内容。因此,它试图将XML解释为一个URL,毫不奇怪,XML不是以有效的协议(如“http:”)开头的

解决方案是改用StreamSource(Reader)构造函数:

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

问题是什么?你看到一些例外吗?AFIK没有必要让该域访问xsd文件。语法分析器必须有该文件的副本,这一点非常重要。抱歉,该文件尚未完成并发布。我的问题现在完成了:)现在错误完全有道理了。。。。这就是为什么我需要另一双眼睛。谢谢