1

私のJavaに以下のようなフィールドがあるxmlタグHelloがあります

class HelloWorld{ @XmlElement private String name; }

アンマーシャリング中に、Hello 値が name 変数に正常に割り当てられます。マーシャリングを行っているこの Java オブジェクト (HelloWorld) から新しい xml を作成したいのですが、この場合、xml の代わりに xml タグが必要です。Jaxbでこれを達成するにはどうすればよいですか?

どちらの Xml も自分の管理下にないため、タグ名を変更できません

編集:

着信 XML - helloworld.xml

    <helloworld>
     <name>hello</name>
     </helloworld>

     @XmlRootElement(name="helloworld)
     class HelloWorld{

     @XmlElement(name="name")
     private String name;

      // setter and getter for name
     }

      JaxbContext context = JAXBContext.newInstance(HelloWorld.class);
      Unmarshaller un = conext.createUnmarshaller un();
      HelloWorld hw = un.unmarshal(new File("helloworld.xml"));
      System.out.println(hw.getName()); // this will print hello as <name> tag is mapped with name variable.

ここで、HelloWorld オブジェクトのこの hw オブジェクトを使用して、以下のような xml を作成します。

    <helloworld>
     <name_1>hello</name_1>   // Note <name> is changed to <name_1>
    </helloworld>

Helloworld のような別のクラスを作成して、その新しいクラスで変数 name_1 を宣言したくありません。タグ名が変更されただけなので、この HelloWorld クラスを再利用したいのです。

しかし、私は既存の HelloWorld クラスを使用し、以下のようにオブジェクト hw をマーシャリングしようとします

    JaxbContext context = JAXBContext.newInstance(HelloWorld.class);
     Marshaller m = conext.createMarshaller();
     StringWriter writer = new StringWriter();
     m.marshal(hw,writer);
     System.out.println(writer.toString());

これは以下のように印刷されます

  <helloworld>
<name>hello</name>
  </helloworld>

しかし、私は必要です

  <helloworld>
<name_1>hello</name_1>   // Note <name> is changed to <name_1>
  </helloworld>

この理由は、アンマーシャリング前の着信 xml とマーシャリング後の発信 xml が私の制御下にないためです。

これが説明することを願っています。

4

1 に答える 1

0

オプション #1 - すべての JAXB 実装で動作します

XSLT 変換を使用して、 aJAXBSourceを必要な XMLに変換できます。

    // Create Transformer
    TransformerFactory tf = TransformerFactory.newInstance();
    StreamSource xslt = new StreamSource(
            "src/blog/jaxbsource/xslt/stylesheet.xsl");
    Transformer transformer = tf.newTransformer(xslt);

    // Source
    JAXBContext jc = JAXBContext.newInstance(Library.class);
    JAXBSource source = new JAXBSource(jc, catalog);

    // Result
    StreamResult result = new StreamResult(System.out);

    // Transform
    transformer.transform(source, result);

詳細については


オプション #2 - EclipseLink JAXB (MOXy)で動作

注: 私は MOXy のリーダーです。

MOXy は、フィールド/プロパティ レベルでマッピングをオーバーライドするために使用できるマッピング ドキュメント拡張を提供します。これは、注釈だけで 1 つを作成し、次にXML オーバーライドを使用して注釈に基づいてJAXBContext2 つ目を作成できることを意味します。JAXBContext

詳細については

于 2014-01-21T18:18:18.943 に答える