2012-06-07 2 views
3

Я видел аналогичный вопрос, который был отправлен здесь, но это не помогло мне решить проблему, поэтому я размещаю свой вопрос здесь, чтобы узнать, может ли кто-то изменить мой код, чтобы сделать он работает.JAXB- @XmlMixed использование для чтения @XmlValue и @XmlElement

Вопрос: Как получить доступ к смешанному контенту Строковое значение и сохранить его в методе 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 маршализации и Маршалла я могу получить все, что превращается в объекте и и сохранил accorderling, за исключением фактического фразу «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).

ответ

16

Я попытаюсь ответить на ваш вопрос с примером:

Input.xml

Мы будем использовать следующий XML-документ для этого примера. Элемент root имеет смешанный контент. Смешанный континент означает, что текстовые узлы могут смешиваться с элементами. Поскольку может отображаться более одного текстового узла, унарное свойство не подходит.

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

Demo

Следующий код будет использоваться, чтобы читать в XML объекта формы, а затем записать его обратно в 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 - Один Список Удержанию Смешанное содержимое

@XmlMixed наиболее часто используется, чтобы с другой аннотацию, так что в результате List содержит как элемент и содержание текста. Одно из преимуществ этого заключается в том, что порядок поддерживается таким образом, чтобы документ можно было отключить.

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 - строковое свойство для текстового контента

Поскольку текстовые узлы могут происходить несколько раз в смешанном содержимом, свойство не-List не очень подходит, и кажется, как будто аннотация @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> 
+0

Спасибо за вашу помощь Блеза. Я смог заставить его работать. Также вы знаете способ убедиться, что корневой префикс (prefix1: att1 = "att1") - последнее, что показано? Я хочу, чтобы он появился в элементе tt последним, после пространств имен (xmlns = "link1" xmlns: prefix2 = "link2"). –

Смежные вопросы