Pergunta

Eu sou analisar um documento XML que tem nós como o seguinte:

<objects>
  <dog>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </dog>
  <cat>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </cat>
</objects>

Os elementos data1, data2, data3 são sempre consistentes. Apenas a tag pai varia. No meu modelo de objeto Eu tenho um único objeto que representa todos esses casos. Como posso obter JAXB para lidar com este caso sem saber antecipadamente o nome do elemento?

@XMLAnyElement corresponde a todos os objetos, mas não cria um objeto do tipo apropriado; I obter uma lista de nó objetos em vez do meu objeto. Meu objeto atualmente é algo como:

public class MyObject {
    protected String otherData;

    @XmlAnyElement
    @XmlElementWrapper(name = "objects")
    protected List<MyChildObject> childObjects;
}

public class MyChildObject {
    protected String data1;
    protected String data2;
    protected String data3;
}

Todas as idéias como lidar com este caso curto de mudar o formato XML de entrada para elementos uso <object type="dog">?

Foi útil?

Solução

Se o nome é verdadeiramente dinâmico, então eu não acho que JAXB irá ajudá-lo a estes. Se você tem um número definido de vários nomes de elementos, então você pode usar a herança como o outro post sugeriu. Se o número de elementos e nomes é desconhecida eu recomendo usar algo como isto:

@XmlMixed
@XmlAnyElement
public List<Object> getObjects() {
    return objects;
}

Isso traria o elemento é um apenas um elemento DOM. Você poderia, então, usar JAXB uma segunda vez para ir de cada um dos elementos em seu tipo personalizado.

Isso seria se você tivesse que usar JAXB. Você pode achar que é mais fácil simplesmente usar o SAX ou APIs DOM diretamente para os dados como este. JAXB é realmente destinado a dados bem definidas que podem ser representados como um esquema.

Outras dicas

Você pode usar a herança:

@XmlRootElement(name = "dog")
public class MyDogObject extends MyChildObject {
    //nothing here
}

@XmlRootElement(name = "cat")
public class MyCatObject extends MyChildObject {
    //nothing here
}

Desta forma, ele permite que você lidar com o mesmo tipo de objeto, MyChildObject, ainda controlar de forma flexível a estrutura XML. Outra vantagem é que você deve definir nós XML cão / gato específicos no futuro -. Eles podem ser mapeados em que subclasse correspondente mas não o outro, como esperado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top