JAXB - @XmlMixed 用于读取 @XmlValue 和 @XmlElement 的用法 [英] JAXB- @XmlMixed usage for reading @XmlValue and @XmlElement
问题描述
我看到这里发布了一个类似的问题,但它并没有帮助我解决问题,所以我在这里发布我的问题,看看是否有人可以修改我的代码以使其正常工作.
I saw a similar question being posted here, yet it did not help me solve the problem so I am posting my question here to see if someone can modify my code to make it work.
问题:如何获取混合内容字符串值并保存在setPhrase(String value)方法中?
Question: How to access mixed content String value and save it in setPhrase(String value) method?
标题.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:
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,但我无法弄清楚.
After using JAXB unmarshall and marshall I am able to get everything converted into and object and saved accorderling, except for the actual phrase "Hello World.". I know I must use some sort of @XmlMixed for this complex element but I cannot figure it out.
我当前的 output.xml:
My current 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)
Desire output.xml: (same as 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) 方法中.
Thanks in advance to any help I may get to access this value and save it in setPhrase(String value) method.
推荐答案
我会试着用一个例子来回答你的问题:
I'll try to answer your question with an example:
input.xml
我们将在此示例中使用以下 XML 文档.root
元素具有混合内容.具有混合内容意味着文本节点可以与元素混合出现.由于可以出现多个文本节点,因此一元属性并不适合.
We will use the following XML document for this example. The root
element has mixed content. Having mixed conent means that text nodes can appear mixed in with the elements. Since more than one text node can appear a unary property isn't a good fit.
<?xml version="1.0" encoding="UTF-8"?>
<root>
<root/>
Hello
<root/>
World
<root/>
</root>
演示
以下代码将用于读取 XML 到对象的形式,然后将其写回 XML.
The following code will be used in to read in the XML to object form and then write it back to 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
包含元素和文本内容.这样做的一个好处是可以保持顺序,以便文档可以往返.
@XmlMixed
is most often used to with another annotation, so that the resulting List
contains both element and text content. One advantage of this is that order is maintained so that the document can be round tripped.
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 - 混合内容的单独列表
您还可以为文本内容引入单独的列表属性.
You can can also introduce a separate list property for the text content.
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
注释被忽略了.
Since text nodes can occur multiple times in mixed content, a non-List property isn't a good fit and it appears as though the @XmlMixed
annotation is being ignored.
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>
这篇关于JAXB - @XmlMixed 用于读取 @XmlValue 和 @XmlElement 的用法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!