2

我正在一个大型企业平台上进行集成,供应商喜欢经常更新他们的 XML 格式,尽管他们已经承诺更改将继续向后兼容。我有一个可以工作的 XSD……现在……但我想用我们的应用程序代码部署该架构,而不必为每个 Web 服务更新重新部署。作为额外的推动力,(基于 JVM 的)配置语言具有非常好的 XSD 类型导入功能。

作为后备方案,我可以使用 XPath 查询提取特定元素,但这并不那么令人愉快。

  • 如何继续针对已过时但未过时的模式文件解析不断发展的 XML ?

我正在寻找诸如“松散解析”选项或“忽略未知标签”之类的东西,它们可以让我访问我们的应用程序当前知道和关心的文档部分。任何新标签都可以丢弃——从业务角度来看,它们是无关紧要的。

4

1 回答 1

4

这是 JAXB(用于 XML 绑定的 Java 体系结构)的默认行为,它是用于定义 Java 对象如何从 XML 转换为 XML 的 Java 标准。

如果您从别人提供的 XSD 开始,您可以使用 JDK 附带的 xjc 工具生成类。

> xjc vendor.xsd

查看如何从 xsd 生成 jaxb 类

默认情况下,这将创建一个“生成的”类包,代表 XSD 中定义的元素。如果 XML 的顶部元素是 VendorDocument,则以下代码将让您使用输入文件:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import generated.VendorDocument;

public class VendorMain {

  public static void main(String[] args) throws JAXBException, IOException {

    // create JAXB context
    JAXBContext context = JAXBContext.newInstance(VendorDocument.class);

    // unmarshal document from file
    Unmarshaller um = context.createUnmarshaller();
    VendorDocument vendorDoc = (VendorDocument) um.unmarshal(new FileReader("vendor.xml"));


    //Check what got read in by writing it out.  Will not have unknown tags.
    Marshaller m = context.createMarshaller();
    m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
    m.marshal(vendorDoc, new File("output.xml"));

  }
}

您将看到,如果您向 vendor.xml 输入文件添加额外的标签和属性,它们将被忽略,您可以继续访问您需要的文档部分。只要将来只是将内容添加到 XSD 中而不是删除,您就不应该有问题。

上面的代码片段改编自本教程

于 2014-04-03T16:58:37.787 回答