2

我目前正在使用 JAXB 注释,它适用于大多数情况。但是,我遇到了一些我无法弄清楚如何处理/创建注释的东西。我有以下 XML:

   <animals>
      <animal>
        cat
        <age>5</age>
        <color>red</color>
      </animal>
   </animals>

有没有办法我可以直接从catXML 中获取“”而不获取“ 5”或“ 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
4

3 回答 3

1

尝试这样的事情:

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

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

public class Animal {

    @XmlMixed
    List<Object> content;
}

现在,content字段 ofAnimal将包含StringJAXBElement对象的混合。您需要在运行时检查它们以提取所需的位。

于 2011-06-27T22:29:19.107 回答
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>
于 2011-06-27T22:33:44.957 回答
1

您可以使用 JAXB 解组 StAX 输入并利用 StreamFilter 消除不需要的节点:

于 2011-06-27T23:04:51.203 回答