3

同様の質問がここに投稿されているのを見ましたが、問題を解決するのに役立たなかったので、誰かが私のコードを変更して機能させることができるかどうかを確認するためにここに質問を投稿しています。

質問:混合コンテンツの文字列値にアクセスしてsetPhrase(String value)メソッドに保存するにはどうすればよいですか?

caption.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
                Hello World.
            </p>
        </div>
    </body>
</tt>

Caption.java:

package com;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementRef;
import javax.xml.bind.annotation.XmlElementRefs;
import javax.xml.bind.annotation.XmlMixed;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "p")
@XmlType(propOrder = { "att1", "att2", "att3", "phrase", "subelement"})
public class Caption {
    private String  att1;
    private String  att2;
    private String  att3;
    private String  phrase;
    private Subelement subelement = new Subelement();

   @XmlMixed
   public void setPhrase(String value)
   {
      this.phrase = value;
   }
   public String getPhrase()
   {
      return phrase;
   }

   @XmlElementRefs({@XmlElementRef(name = "subelement", type = Subelement.class)})
   @XmlMixed
   public void setSubelement(Subelement subelement )
   {
      this.subelement = subelement;
   }
   public Subelement getSubelement()
   {
      return subelement;
   }

   @XmlAttribute
   public void setAtt1( String att1 )
   {
      this.att1 = att1;
   }
   public String getAtt1()
   {
      return att1;
   }

   @XmlAttribute
   public void setAtt2( String att2 )
   {
      this.att2 = att2;
   }
   public String getAtt2()
   {
      return att2;
   }

   @XmlAttribute
   public void setAtt3( String att3 )
   {
      this.att3 = att3;
   }
   public String getAtt3()
   {
      return att3;
   }
}

JAXB unmarshallとmarshallを使用した後、実際のフレーズ「Hello World」を除いて、すべてを変換してオブジェクトにし、アコーダリングを保存することができます。この複雑な要素に何らかの@XmlMixedを使用する必要があることはわかっていますが、理解できません。

私の現在のoutput.xml:

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
            </p>
        </div>
    </body>
</tt>

output.xmlを希望する:(caption.xmlと同じ)

<?xml version="1.0" encoding="UTF-8"?>
<tt xmlns="link1" xmlns:prefix2="link2" prefix1:att1="att1">
    <head>
        <styling>
            <style prefix1:att1="att1" prefix2:att2="att2" prefix2:att3="att3" prefix2:att4="att4" />
        </styling>
        <layout />
    </head>
    <body xmlns:prefix3="link3">
        <div prefix1:att1="att1" prefix1:att2="att2">
            <prefix3:info att1="att1" att2="att2" />
            <p att1="att1" att2="att2" att3="att3">
                <prefix3:status att1="att1" att2="att2" />
                Hello World.
            </p>
        </div>
    </body>
</tt>

事前に助けてくれてありがとう、この値にアクセスしてsetPhrase(String value)メソッドに保存することができます。

4

1 に答える 1

18

私は例であなたの質問に答えようとします:

input.xml

この例では、次のXMLドキュメントを使用します。要素のroot内容が混在しています。conentが混在しているということは、テキストノードが要素と混在して表示される可能性があることを意味します。複数のテキストノードが表示される可能性があるため、単項プロパティは適切ではありません。

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <root/>
    Hello
    <root/>
    World
    <root/>
</root>

デモ

次のコードは、XML to Objectフォームを読み込み、XMLに書き戻すために使用されます。

package forum10940267;

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum10940267/input.xml");
        Root root = (Root) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

ユースケース#1-混合コンテンツを保持するための1つのリスト

@XmlMixedほとんどの場合、別の注釈で使用されるため、結果Listには要素とテキストの両方のコンテンツが含まれます。これの利点の1つは、ドキュメントをラウンドトリップできるように順序が維持されることです。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();

    @XmlElementRef(name="root", type=Root.class)
    @XmlMixed
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

}

出力

出力は入力と一致します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    Hello
    <root/>
    World
    <root/>
</root>

ユースケース#2-混合コンテンツの個別リスト

テキストコンテンツ用に別のリストプロパティを導入することもできます。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();
    private List<String> text;

    @XmlElementRef(name="root", type=Root.class)
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

    @XmlMixed
    public List<String> getText() {
        return text;
    }

    public void setText(List<String> text) {
        this.text = text;
    }

}

出力

出力が入力と一致しなくなりました。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    <root/>
    <root/>

    Hello

    World

</root>

ユースケース#3-テキストコンテンツの文字列プロパティ

テキストノードは混合コンテンツで複数回発生する可能性があるため、非リストプロパティは適切ではなく、@XmlMixedアノテーションが無視されているように見えます。

package forum10940267;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Root {

    private List<Object> mixedContent = new ArrayList<Object>();
    private String text;

    @XmlElementRef(name="root", type=Root.class)
    public List<Object> getMixedContent() {
        return mixedContent;
    }

    public void setMixedContent(List<Object> mixedContent) {
        this.mixedContent = mixedContent;
    }

    @XmlMixed
    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

出力

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <root/>
    <root/>
    <root/>
</root>
于 2012-06-19T10:42:16.620 に答える