我目前正在使用JAXB注释,这对大多数情况都很有用。但是,我遇到了一些我无法弄清楚如何处理/创建注释的东西。我有以下XML:
<animals>
<animal>
cat
<age>5</age>
<color>red</color>
</animal>
</animals>
我是否可以在不提取“cat
”或“5
”的情况下从该XML中获取“red
”?
这是我到目前为止所做的:
@XmlRootElement(name = "animals")
public class Animal {
@XmlElement(name = "animal")
String type;
}
但是当我解开这个时,我只得到一个空字符串。
任何帮助将不胜感激!
修改
以下是我正在尝试做的完整工作示例:
@XmlRootElement(name = "animals")
private static class Animals {
@XmlElement(name = "animals")
String animalType;
}
// This code is in "main"
final String animalsXml = "<animals><animal>cat<color>red</color><age>5</age></animal></animals>";
JAXBContext context = JAXBContext.newInstance(Animals.class);
Unmarshaller um = context.createUnmarshaller();
ByteArrayInputStream bais = new ByteArrayInputStream(animalsXml.getBytes("UTF-8"));
Animals animals = (Animals)um.unmarshal(bais);
boolean animalIsCat = animals.animalType == null ? false : animals.animalType.equalsIgnoreCase("cat");
assert animalIsCat;
// end code in main
答案 0 :(得分:1)
尝试这样的事情:
@XmlRootElement(name = "animals")
public class Animals {
@XmlElement(name = "animal")
List<Animal> animals;
}
public class Animal {
@XmlMixed
List<Object> content;
}
现在,content
的{{1}}字段将包含Animal
和String
个对象的混合。您需要在运行时检查它们以提取所需的位。
答案 1 :(得分:1)
首先,xml结构应该是连贯的 - 将动物的类型放入“type”标签:
<animals>
<animal>
<type>cat</type>
<age>5</age>
<color>red</color>
</animal>
<animal>
<type>dog</type>
<age>7</age>
<color>orange</color>
</animal>
</animals>
然后你有两个选择。 1.根据您的示例,您需要两个类:一个用于动物,一个用于动物,因为默认情况下,JAXB将每个标记映射到一个类。虽然你需要一个集合来“包含”java中的对象,但xml却没有,而这就是差异的来源。相应的注释:
package sample;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="animals")
public class Animals
{
@XmlElement(name="animal")
public List<Animal> animals;
public static class Animal
{
public String type;
public String color;
public Integer age;
}
}
然而,这种解决方案并不是最优雅的。如果您只想从中间跳过容器类,可以使用@XmlElementWrapper注释:
package sample;
import java.util.List;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="MyDocument")
public class MyDocument
{
public String comment;
@XmlElementWrapper(name="animals")
@XmlElement(name="animal")
public List<Animal> animals;
public static class Animal
{
public String type;
public String color;
public Integer age;
}
}
xml就是这样:
<MyDocument>
<animals>
<animal>
<type>cat</type>
<age>5</age>
<color>red</color>
</animal>
<animal>
<type>dog</type>
<age>7</age>
<color>orange</color>
</animal>
</animals>
</MyDocument>
答案 2 :(得分:1)
您可以使用JAXB解组StAX输入并利用StreamFilter消除不需要的节点: