2

私は大規模エンタープライズ プラットフォームに統合しており、ベンダーは XML 形式を頻繁に更新することを好みますが、変更には引き続き下位互換性があると約束しています。動作する XSD があります...現在...しかし、そのスキーマをアプリケーション コードと共にデプロイし、Web サービスの更新ごとに再デプロイする必要がないようにしたいと考えています。追加の推進力として、(JVM ベースの)構成言語には非常に優れた XSD タイプのインポート機能があります。

フォールバックとして、XPath クエリを使用して特定の要素を抽出することもできますが、これはあまり快適ではありません。

  • 時代遅れではあるが時代遅れではないスキーマ ファイルに対して進化する XML を解析し続けるにはどうすればよいですか?

アプリケーションが現在認識して関心を持っているドキュメントの部分にアクセスできるようにする「緩やかな解析」オプションや「不明なタグを無視する」などのオプションを探しています。新しいタグは破棄できます。ビジネスの観点からは、それらは無関係です。

4

1 に答える 1

4

これは、Java オブジェクトが XML との間でどのように変換されるかを定義するための Java 標準である JAXB (Java Architecture for XML Binding) のデフォルトの動作です。

他の誰かが提供した 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 に追加されるだけで、削除されない限り、問題はないはずです。

上記のコード スニペットは、このチュートリアルから改作されました。

于 2014-04-03T16:58:37.787 に答える