Есть ли способ отобразить значение узла, когда узел также имеет внутренние узлы? - PullRequest
2 голосов
/ 28 июня 2011

В настоящее время я использую аннотации JAXB, которые отлично работают в большинстве случаев. Однако я столкнулся с тем, что не могу понять, как обрабатывать / создавать аннотации. У меня есть следующий XML:

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

Есть ли способ, которым я могу просто извлечь "cat" из этого XML без извлечения "5" или "red"?

Вот что у меня есть:

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

    @XmlElement(name = "animal")
    String type;
}

Но когда я отменяю это, я просто получаю пустую строку.

Буду признателен за любую помощь!

EDIT
Вот полный рабочий пример того, что я пытаюсь сделать:

@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 ]

1 голос
/ 28 июня 2011

Прежде всего, структура 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>
1 голос
/ 28 июня 2011

Вы можете использовать JAXB для демонтажа входа StAX и использовать StreamFilter для устранения нежелательных узлов:

1 голос
/ 28 июня 2011

Попробуйте что-то вроде этого:

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

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

public class Animal {

    @XmlMixed
    List<Object> content;
}

Теперь в поле content Animal будет содержаться сочетание String и JAXBElement объектов.Вам нужно будет проверить их во время выполнения, чтобы извлечь нужные биты.

...