【问题标题】:JAXB- @XmlMixed usage for reading @XmlValue and @XmlElementJAXB - @XmlMixed 用于读取 @XmlValue 和 @XmlElement 的用法
【发布时间】:2012-06-19 18:42:16
【问题描述】:

我看到这里发布了一个类似的问题,但它并没有帮助我解决问题,所以我在这里发布我的问题,看看是否有人可以修改我的代码以使其工作。

问题:如何获取混合内容字符串值并保存在setPhrase(String value)方法中?

标题.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 之后,我能够将所有内容转换为对象并保存 accerling,但实际的短语“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>

Desire 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) 方法中。

【问题讨论】:

    标签: jaxb


    【解决方案1】:

    我会试着用一个例子来回答你的问题:

    input.xml

    我们将在此示例中使用以下 XML 文档。 root 元素具有混合内容。具有混合内容意味着文本节点可以与元素混合出现。由于可以出现多个文本节点,因此一元属性并不适合。

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

    演示

    以下代码将用于读取 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 - 文本内容的字符串属性

    由于文本节点可以在混合内容中多次出现,因此非列表属性不适合,并且看起来好像 @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>
    

    【讨论】:

    • 感谢您的帮助布莱斯。我能够让它工作。您还知道一种方法来确保根前缀 (prefix1:att1="att1") 是最后显示的内容吗?我希望它最后出现在 tt 元素中,在命名空间 (xmlns="link1" xmlns:prefix2="link2") 之后。
    猜你喜欢
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2013-03-03
    • 1970-01-01
    相关资源
    最近更新 更多