Java 当节点也有内部节点时,是否有方法映射节点的值?
我目前正在使用JAXB注释,这在大多数情况下都非常有效。然而,我遇到了一些我不知道如何处理/创建注释的问题。我有以下XML:Java 当节点也有内部节点时,是否有方法映射节点的值?,java,xml,jaxb,jaxb2,Java,Xml,Jaxb,Jaxb2,我目前正在使用JAXB注释,这在大多数情况下都非常有效。然而,我遇到了一些我不知道如何处理/创建注释的问题。我有以下XML: <animals> <animal> cat <age>5</age> <color>red</color> </animal> </animals> 但当我解开这个时,我只得到一个空字符串
<animals>
<animal>
cat
<age>5</age>
<color>red</color>
</animal>
</animals>
但当我解开这个时,我只得到一个空字符串
任何帮助都将不胜感激
编辑
下面是我尝试做的一个完整的工作示例:
@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
@XmlRootElement(name=“animals”)
私人静态类动物{
@XmlElement(name=“动物”)
字符串动物型;
}
//此代码位于“main”中
最后一个字符串animalsXml=“catred5”;
JAXBContext context=JAXBContext.newInstance(anives.class);
Unmarshaller um=context.createUnmarshaller();
ByteArrayInputStream bais=新的ByteArrayInputStream(animalsXml.getBytes(“UTF-8”);
动物=(动物)um.unmarshal(bais);
布尔animalIsCat=animals.animalType==null?错误:动物。动物类型。等信号(“猫”);
主张动物化;
//主程序中的结束代码
尝试以下方法:
@XmlRootElement(name = "animals")
public class Animals {
@XmlElement(name = "animal")
List<Animal> animals;
}
public class Animal {
@XmlMixed
List<Object> content;
}
@XmlRootElement(name=“animals”)
公营动物{
@XmlElement(name=“animal”)
列出动物;
}
公营动物{
@混合
列出内容;
}
现在,
Animal
的content
字段将混合包含String
和JAXBElement
对象。您需要在运行时检查它们以提取所需的位。首先,xml结构应该是一致的-将动物的类型放入“type”标记中:
猫
5.
红色
狗
7.
橙色
那么你有两个选择。
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;
}
}
包装样品;
导入java.util.List;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=“动物”)
公营动物
{
@XmlElement(name=“animal”)
公布动物名单;
公共静态类动物
{
公共字符串类型;
公共字符串颜色;
公众年龄;
}
}
然而,这个解决方案并不是最优雅的。如果只想从中间跳过容器类,可以使用@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;
}
}
包装样品;
导入java.util.List;
导入javax.xml.bind.annotation.xmlement;
导入javax.xml.bind.annotation.XmlElementWrapper;
导入javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name=“MyDocument”)
公共类MyDocument
{
公共字符串评论;
@XmlElementWrapper(name=“动物”)
@XmlElement(name=“animal”)
公布动物名单;
公共静态类动物
{
公共字符串类型;
公共字符串颜色;
公众年龄;
}
}
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>
猫
5.
红色
狗
7.
橙色
您可以使用JAXB对StAX输入进行解组,并利用StreamFilter消除不需要的节点:
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;
}
}
<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>