Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当节点也有内部节点时,是否有方法映射节点的值?_Java_Xml_Jaxb_Jaxb2 - Fatal编程技术网

Java 当节点也有内部节点时,是否有方法映射节点的值?

Java 当节点也有内部节点时,是否有方法映射节点的值?,java,xml,jaxb,jaxb2,Java,Xml,Jaxb,Jaxb2,我目前正在使用JAXB注释,这在大多数情况下都非常有效。然而,我遇到了一些我不知道如何处理/创建注释的问题。我有以下XML: <animals> <animal> cat <age>5</age> <color>red</color> </animal> </animals> 但当我解开这个时,我只得到一个空字符串

我目前正在使用JAXB注释,这在大多数情况下都非常有效。然而,我遇到了一些我不知道如何处理/创建注释的问题。我有以下XML:

   <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消除不需要的节点:


你能分享一下你是如何进行解组的吗?mkro,我添加了我正在使用的完整代码。谢谢,我同意XML结构应该是一致的,而这个XML所属的XML结构让我抓狂。但是,我无法控制XML的结构,因此我必须做出适当的调整。
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>