【发布时间】:2011-01-30 07:34:49
【问题描述】:
我一直在寻找解决这个问题的时间太长了考虑如何方便听起来是那么我来一些帮助。 P>
我有我与XJC用于创建我的JAXB绑定的XML架构。当形成良好的XML这工作得很好。不幸的是,还时不能很好地形成的XML不抱怨。我无法弄清楚如何做正确的全面验证在架构上,当我试图来解读一个XML文件。 P>
我已经成功地使用ValidationEventCollector来处理事件,这适用于XML解析错误,如不匹配的标签,但不会引发任何事件时有所需标签,但是完全不存在。 P>
这是我所看到的验证可以做到againsta模式,但你必须知道的路径,模式,以将其传递到的setSchema()方法。我的问题是,路径架构存储在XML头,我不能在这里的模式将是运行时间knwo。这就是为什么它存储在XML文件中: P>
<?xml version="1.0" encoding="utf-8"?>
<DDSSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="/a/big/long/path/to/a/schema/file/DDSSettings.xsd">
<Field1>1</Field1>
<Field2>-1</Field2>
...等
每个例子中我看到的setValidating用途(真),这是现在已经过时,所以抛出异常。 P>
这是Java代码,我到目前为止,这似乎只能做XML验证,而不是架构验证: P>
try {
JAXBContext jc = new JAXBContext() {
private final JAXBContext jaxbContext = JAXBContext.newInstance("blah");
@Override
public Unmarshaller createUnmarshaller() throws JAXBException {
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
ValidationEventCollector vec = new ValidationEventCollector() {
@Override
public boolean handleEvent(ValidationEvent event) throws RuntimeException {
ValidationEventLocator vel = event.getLocator();
if (event.getSeverity() == event.ERROR || event.getSeverity() == event.FATAL_ERROR) {
String error = "XML Validation Exception: " + event.getMessage() + " at row: " + vel.getLineNumber() + " column: " + vel.getColumnNumber();
System.out.println(error);
}
m_unmarshallingOk = false;
return false;
}
};
unmarshaller.setEventHandler(vec);
return unmarshaller;
}
@Override
public Marshaller createMarshaller() throws JAXBException {
throw new UnsupportedOperationException("Not supported yet.");
}
@Override
@SuppressWarnings("deprecation")
public Validator createValidator() throws JAXBException {
throw new UnsupportedOperationException("Not supported yet.");
}
};
Unmarshaller unmarshaller = jc.createUnmarshaller();
m_ddsSettings = (com.ultra.DDSSettings)unmarshaller.unmarshal(new File(xmlfileName));
} catch (UnmarshalException ex) {
Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
Level.SEVERE,
null, ex);
} catch (JAXBException ex) {
Logger.getLogger(UniversalDomainParticipant.class.getName()).log(
Level.SEVERE,
null, ex);
}
那么,什么是做到这一点的验证的正确方法?我期待有要对JAXB生成的类一个validate()方法,但我想这将是对Java太简单。 P>
【问题讨论】:
标签: xml validation schema jaxb well-formed