我有下一个html,我想解析:
My input:
<div>
<span id="x1x1"> bla bla </span>
</div>
<span>
<div> bla bla </div>
</span>
My output in java:
jaxbContext = JAXBContext.newInstance(Div.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
jaxbUnmarshaller.unmarshal(file);
System.out.println("id " + div1.getSpan().get(0).get(id) + "value " + div1.getSpan().get(0).get(id))
// should print: id = x1x1 value = bla bla
我下一个类:
public class Span
List<Div> div;
public List<Div> getDiv() {
return div;
}
@XmlElement
public void setDiv(List<Div> div) {
for (int i = 0 ; i<div.size(); i++){
System.out.print("element")}
this.div = div;
}
和:
public class Div
List<Span> span = div1.get
@XmlElement
public void setSpan(List<Span> span) {
for (int i = 0 ; i<span.size(); i++){
System.out.print("element")}
this.span = span;
}
public List<Button> getSpan() {
return span;
}
现在,我还需要span的值(“bla bla”)。所以我添加到类
Span
:String value;
public String getValue() {
return value;
}
@XmlValue
public void setValue(String value) {
this.value = value;
}
有点给我下一个错误:
If a class has '@XmlElement' property, it cannot have '@XmlValue' property.
我尝试使用@XMLMixed,但没有成功。我会很高兴例如代码示例。谢谢。
最佳答案
更新
可以同时具有文本和元素的子注释的任何元素都称为混合内容。在JAXB中,这对应于@XmlMixed
批注。 @XmlMixed
可以单独用于collection属性(请参阅ORIGINAL ANSWER),也可以与@XmlAnyElement
,@XmlElementRef
或@XmlElementRefs
结合使用。如果该元素可以是任何一种,则可以使用@XmlAnyElement
;如果它是一个已知的元素,则可以使用@XmlElementRef
;而它是一个以上的已知元素,则可以使用@XmlElementRefs
。
跨度
如果在同一个span元素中将同时包含text和div
元素,则可以通过同时使用@XmlElementRef
和@XmlMixed
注释属性来执行以下操作。在@XmlElementRef
注释上指定的元素名称必须直接对应于为目标类指定的根元素。
@XmlRootElement
public class Span {
List<Object> items = new ArrayList<Object>();
@XmlMixed
@XmlElementRef(type=Div.class, name="div")
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> mixed) {
this.items = items;
}
}
Div
Div
的元数据几乎与Span
指定的元数据相同。@XmlRootElement
public class Div {
List<Object> items = new ArrayList<Object>();
@XmlElementRef(name="span", type=Span.class)
@XmlMixed
public List<Object> getItems() {
return items;
}
public void setItems(List<Object> items) {
this.items = items;
}
}
演示
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Span.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Span span = (Span) unmarshaller.unmarshal(new StringReader("<span>Text<div>Text2</div>Text3</span>"));
System.out.println(span.getItems());
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(span, System.out);
}
}
输出
[Text, forum15495156.Div@289f6ae, Text3]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<span>Text<div>Text2</div>Text3</span>
原始答案
您可以在
List<String>
类中添加带有@XmlMixed
注释的Span
属性:跨度
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Span {
List<Div> div;
List<String> mixed;
@XmlMixed
public List<String> getMixed() {
return mixed;
}
public void setMixed(List<String> mixed) {
this.mixed = mixed;
}
public List<Div> getDiv() {
return div;
}
@XmlElement
public void setDiv(List<Div> div) {
for (int i = 0; i < div.size(); i++) {
System.out.print("element");
}
this.div = div;
}
}
演示
import java.io.StringReader;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Span.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
Span span1 = (Span) unmarshaller.unmarshal(new StringReader("<span>bla bla bla</span>"));
System.out.println(span1.getMixed());
Span span2 = (Span) unmarshaller.unmarshal(new StringReader("<span><div/><div/></span>"));
System.out.println(span2.getDiv());
}
}
输出
[bla bla bla]
elementelement[forum15495156.Div@1f80ce47, forum15495156.Div@4166a779]