【发布时间】:2010-10-08 18:25:29
【问题描述】:
我被分配了一项针对 XSD 验证 XML 的工作,如果通过的所有内容都将解析 XML,以便可以将其导入到我的系统中。
我的问题是,根据 XSD 验证 XML 的最佳方法是什么,以及将 XML 解析到我的域对象中的最佳 API。
寻找有价值的建议
【问题讨论】:
标签: java xml validation xsd
我被分配了一项针对 XSD 验证 XML 的工作,如果通过的所有内容都将解析 XML,以便可以将其导入到我的系统中。
我的问题是,根据 XSD 验证 XML 的最佳方法是什么,以及将 XML 解析到我的域对象中的最佳 API。
寻找有价值的建议
【问题讨论】:
标签: java xml validation xsd
第 1 部分 - 验证 XML
您可以为此使用javax.xml.validation API。
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaURL = // The URL to your XML Schema;
Schema schema = sf.newSchema(schemaURL);
Validator validator = schema.newValidator();
validator.validate(xml);
第 2 部分 - OXM
关于问题的第二部分,将 XML 解析为域对象的最佳 API 是 JAXB。 JAXB is a specification 有多种实现。我领导 MOXy JAXB 实现,其中包含有用的扩展,例如 XPath based mapping。
在将 XML 转换为对象期间,您始终可以进行验证:
JAXBContext jc = JAXBContext.newInstance(Customer.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
URL schemaURL = // The URL to your XML Schema;
Schema schema = sf.newSchema(schemaURL);
unmarshaller.setSchema(schema);
JAXBElement<Customer> element = (JAXBElement<Customer>) unmarshaller.unmarshal(xml);
Customer customer = elemnt.getValue();
【讨论】:
编辑 这里有一些 sax 解析的例子
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);
factory.setNamespaceAware(true);
SAXParser parser = factory.newSAXParser();
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
XMLReader reader = parser.getXMLReader();
reader.setErrorHandler(new ErrorHandler(){
public void warning(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
}
public void error(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
}
public void fatalError(SAXParseException e) throws SAXException {
System.out.println(e.getMessage());
}
});
reader.parse(new InputSource("document.xml"));
(我从here获取源代码)
【讨论】:
JAXB 是 Java 标准 XML 解析库:http://www.oracle.com/technetwork/articles/javase/index-140168.html。它与 Java SE 6 捆绑在一起。
【讨论】:
您可以使用 Castor,它为您的 XSD 生成 Java 类。因此,您可以用几行代码将 XML 转换为对象,反之亦然。
【讨论】: