当节点还有内部节点时,有没有办法映射节点的值?

时间:2011-06-27 22:01:50

标签: java xml jaxb jaxb2

我目前正在使用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

3 个答案:

答案 0 :(得分:1)

尝试这样的事情:

@XmlRootElement(name = "animals")
public class Animals {

    @XmlElement(name = "animal")
    List<Animal> animals;
}

public class Animal {

    @XmlMixed
    List<Object> content;
}

现在,content的{​​{1}}字段将包含AnimalString个对象的混合。您需要在运行时检查它们以提取所需的位。

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