用于读取@XmlValue和@XmlElement的JAXB- @XmlMixed用法 [英] 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?
caption.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>
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后我能够得到除了实际的短语Hello World之外,所有内容都转换为对象并保存了accorderling。我知道我必须为这个复杂的元素使用某种@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);
}
}
USE CASE#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>
USE CASE#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>
USE CASE#3 - 文本内容的字符串属性
由于文本节点可以在混合内容中多次出现,因此非List属性不合适,并且看起来好像 @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>
这篇关于用于读取@XmlValue和@XmlElement的JAXB- @XmlMixed用法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!