2017-09-01 11 views
0

XML < - > Javaオブジェクトをマップする必要があります。マーシャリングとアンマーシャリングにJAXBを使用します。それは素晴らしい。 XMLタグが同じオブジェクトを持つJAXB動的注釈

例(唯一の2言語で)異なる言語で使用できます:

英語版:

<root> 
    <elementA/> 
    <elementB/> 
    <elementC/> 
</root> 

イタリア語版:

<radice> 
    <elementoA/> 
    <elementoB/> 
    <elementoC/> 
</radice> 

は、今私は問題を抱えています問題は、より多くの言語を管理する方法、同じ構造で要素名が異なる複数のXMLソース、1つのJavaオブジェクトを管理する方法ですか? 注釈を動的に変更する方法はありますか?

目標は、1つのオブジェクトを設定し、言語を設定し、マーシャルして簡単にアンマーシャリングすることです。

インターフェイス以上のオブジェクトはソリューションではありません。すべての言語に関連するオブジェクトは例のように簡単ではありませんが、多くの場合は互いに入れ子になっています。

+0

私は見たことがありません誰かがXML要素名をローカライズする必要があります。 – Rob

+0

結果のXMLにXSL変換を適用するアプローチを検討しましたか? – yegodm

+0

XML定義は汎用言語で定義する必要があります。それ以外の場合は、2つの部分で問題を分割します。1)英語版に変換する。2)データを処理する。 –

答えて

0

ここでは、カスタムXMLStreamWriterで行うことができる非常に草案です。これらの例では、2つのMavenの依存関係が(Javaの7を使用して、Javaの8でコードがはるかに簡単かもしれない)必要があります

<dependency> 
     <groupId>net.java.dev.stax-utils</groupId> 
     <artifactId>stax-utils</artifactId> 
     <version>20070216</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
     <version>19.0</version> 
    </dependency> 

そしてここでは、仕事をしてスニペットです:

@XmlRootElement(name = ROOT) 
public static class Root { 
    static final String ROOT = "root"; 
    static final String ELEMENT_A = "elementA"; 

    @XmlElement(name = ELEMENT_A) 
    public Element element_a; 
    public static class Element {} 
} 

public static void main(String[] args) throws Exception { 
    final Root root = new Root(); 
    root.element_a = new Root.Element(); 

    final JAXBContext jaxbContext = JAXBContext.newInstance(Root.class); 
    final Marshaller marshaller = jaxbContext.createMarshaller(); 

    final XMLOutputFactory outputFactory = XMLOutputFactory.newFactory(); 
    final XMLStreamWriter writer = outputFactory.createXMLStreamWriter(System.out); 
    final LocalizingXmlStreamWriter localizingWriter = new LocalizingXmlStreamWriter(writer, Locale.ENGLISH); 
    marshaller.marshal(root, localizingWriter); 
} 

static class LocalizingXmlStreamWriter extends javanet.staxutils.IndentingXMLStreamWriter { 
    final static Map<String, ImmutableMap<String, String>> localizations = Maps.toMap(
     Arrays.asList(Locale.ENGLISH.getLanguage(), Locale.ITALIAN.getLanguage()), 
     new Function<String, ImmutableMap<String, String>>() { 
      @Override 
      public ImmutableMap<String, String> apply(String lang) { 
       if (Locale.ENGLISH.getLanguage().equals(lang)) { 
        return Maps.toMap(Arrays.asList(ROOT, ELEMENT_A), 
         Functions.<String>identity()); 
       } 
       else if (Locale.ITALIAN.getLanguage().equals(lang)) { 
        return Maps.toMap(Arrays.asList(ROOT, ELEMENT_A), 
         new Function<String, String>() { 
          @Override 
          public String apply(String tag) { 
           switch (tag) { 
            case ROOT: 
             return "radice"; 
            case ELEMENT_A: 
             return "elementoA"; 
            default: 
             return tag; 
           } 
          } 
         }); 
       } 
       else throw new IllegalStateException(); 
      } 
     } 
    ); 

    private final ImmutableMap<String, String> localization; 

    public LocalizingXmlStreamWriter(XMLStreamWriter writer, Locale locale) { 
     super(writer); 
     final String language = locale.getLanguage(); 
     localization = localizations.get(language); 
     Preconditions.checkArgument(localization != null, 
      "not supported language %s", language); 
    } 

    @Override 
    public void writeStartElement(String prefix, String localName, String namespaceURI) 
     throws XMLStreamException 
    { 
     final String localizedTag = localization.get(localName); 
     super.writeStartElement(prefix, localizedTag, namespaceURI); 
    } 
} 
関連する問題