gpt4 book ai didi

java - 针对 XSD (java) 验证 XML 的麻烦

转载 作者:数据小太阳 更新时间:2023-10-29 02:16:08 25 4
gpt4 key购买 nike

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

代码如下:

 @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)

最佳答案

问题是您代码中的这一行:

Source xmlFile = new StreamSource(xmlDoc);

正如我们在 the documentation 中看到的那样, StreamSource 构造函数假定 String 参数是 URL,而不是 XML 内容。因此它试图将您的 XML 解释为 URL,毫不奇怪,XML 不是以有效协议(protocol)(例如“http:”)开头。

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

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

关于java - 针对 XSD (java) 验证 XML 的麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18642798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com