【问题标题】:XML with XSD JAVAXML 与 XSD JAVA
【发布时间】:2010-10-08 18:25:29
【问题描述】:

我被分配了一项针对 XSD 验证 XML 的工作,如果通过的所有内容都将解析 XML,以便可以将其导入到我的系统中。

我的问题是,根据 XSD 验证 XML 的最佳方法是什么,以及将 XML 解析到我的域对象中的最佳 API。

寻找有价值的建议

【问题讨论】:

    标签: java xml validation xsd


    【解决方案1】:

    第 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();
    

    【讨论】:

    • Blaise 我认为你指出了正确的方向将探索这些选项谢谢你的建议
    • 乐于助人。一旦您确信这是答案,请考虑将其标记为“已接受”。
    【解决方案2】:

    您可以使用DOMSAX 解析器进行这些操作。

    编辑 这里有一些 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获取源代码)

    【讨论】:

    • 我更喜欢 DOm 仅用于小文件,但由于 XML 文件的大小可以变化以完全扩展我认为 DOM 不会按预期执行
    【解决方案3】:

    JAXB 是 Java 标准 XML 解析库:http://www.oracle.com/technetwork/articles/javase/index-140168.html。它与 Java SE 6 捆绑在一起。

    看看tutorial。使用 Unmarshaler/Marshaler 和 validate 注册模式文件很容易。

    【讨论】:

    • 不,只需在解析器中打开“验证”即可。它还没有达到 OXM 点。
    • +1 用于建议 JAXB,因为问题的第二部分明确询问了 OXM。
    • +1 也来自我..将探索 JAXB 我是一些关于 XML 解析的 sutre 但我第一次在针对 XSD 的验证 XML 上工作
    • 哇,两张反对票?编辑:没关系,忘了投反对票是-2。无论如何,感谢 Blaise 和 umesh 的支持。
    【解决方案4】:

    您可以使用 Castor,它为您的 XSD 生成 Java 类。因此,您可以用几行代码将 XML 转换为对象,反之亦然。

    http://www.castor.org/1.3/index.html

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-03
    • 2010-10-27
    相关资源
    最近更新 更多