ここでは、カスタム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);
}
}
私は見たことがありません誰かがXML要素名をローカライズする必要があります。 – Rob
結果のXMLにXSL変換を適用するアプローチを検討しましたか? – yegodm
XML定義は汎用言語で定義する必要があります。それ以外の場合は、2つの部分で問題を分割します。1)英語版に変換する。2)データを処理する。 –