【问题标题】:Parse XML with an outdated XSD使用过时的 XSD 解析 XML
【发布时间】:2014-05-13 23:19:53
【问题描述】:

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

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

  • 如何继续针对过时但还没有过时的架构文件解析不断发展的 XML?

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

【问题讨论】:

    标签: java xml parsing xsd gosu


    【解决方案1】:

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

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

    > xjc vendor.xsd
    

    how-to-generate-jaxb-classes-from-xsd

    默认情况下,这将创建一个“生成”的类包,代表 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 而不是删除,就没有问题。

    上面的代码sn-p改编自这个tutorial

    【讨论】:

    • 内置的闪亮。
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2020-03-28
    相关资源
    最近更新 更多