簡體   English   中英

使用過時的XSD解析XML

[英]Parse XML with an outdated XSD

我正在大型企業平台上集成,並且供應商喜歡經常更新其XML格式,盡管他們已承諾更改將繼續向后兼容。 我有一個可以工作的XSD ...現在...但是我想用我們的應用程序代碼部署該架構,而不必為每個Web服務更新重新部署。 作為另外的動力,(基於JVM) 配置語言具有非常好的XSD類型導入。

作為后備,我可以使用XPath查詢提取特定的元素,但這並不令人滿意。

  • 如何繼續針對過時已過時的架構文件解析不斷發展的XML?

我正在尋找諸如“松散分析”選項或“忽略未知標簽”之類的東西,這些東西將使我能夠訪問應用程序當前了解和關注的文檔部分。 任何新標簽都可以丟棄-從業務角度來看,它們是無關緊要的。

這是JAXB(用於XML綁定的Java體系結構)的默認行為,這是一種Java標准,用於定義如何將Java對象與XML相互轉換。

如果您從別人提供的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而不將其刪除,就不會有問題。

上面的代碼段是從本教程改編的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM