como processar xml para objeto java?
eu tenho um XML que é usado para a configuração de algumas regras, não tem estrutura complexa, mas esta configuração é usada em qualquer lugar em meu sistema, então gostaria de analisar esse XML para java objeto de design e projeto singleton modo, de qualquer maneira que eu possa usá-lo para desempacotar XML para Java objeto diretamente, sem escrever muito códigos?
Fiz algumas pesquisas no Google e o JAXB conhecido é uma escolha, a minha aplicação é apenas alguns tipos de programa de ferramentas que lêem regras e depois seguem as coisas, o JAXB pode ser usado para o serviço web mais amplamente, ele se encaixa em meus projetos?Se sim, a questão mais importante é, eu usei o xjc para gerar a classe de fonte de objetos java de acordo com o arquivo xsd, depois do unmarshal eu vou obter diretamente esses objetos configurationType, é necessário Eu Converter novamente, (das classes JaxB para minha configuração de objeto java pojo), eu vejo que a maioria do codificador fez isso, mas por quê? porque eles são alguns dados, apenas a partir do objeto gerado para JAXB e copiar para nós mesmos criou objeto POJO
5 answers
O JAXB é uma solução ideal. Mas você não precisa necessariamente de xsd e xjc para isso. Na maioria das vezes você não tem um xsd, mas você sabe o que é o seu xml. Basta analisar o seu xml, por exemplo,
<customer id="100">
<age>29</age>
<name>mkyong</name>
</customer>
Criar A(S) Classe (s) de modelo necessária (s):
@XmlRootElement
public class Customer {
String name;
int age;
int id;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@XmlElement
public void setAge(int age) {
this.age = age;
}
public int getId() {
return id;
}
@XmlAttribute
public void setId(int id) {
this.id = id;
}
}
Tenta não ser Marshal:
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml"));
Verifica os resultados, corrige os erros!
Para realizar Unmarshall usando JAXB:
1) Converter XML dado para XSD (por si próprio ou pelo Conversor online),
2) Criar um projecto JAXB no eclipse,
3) Criar um ficheiro XSD e colar que tenha convertido o conteúdo XSD nele,
4) carregue com o botão direito no **ficheiro XSD--> gerar--> Classes JAXB-->siga as instruções(isto irá criar todo o nessasário .java files in src, i.e., one package-info, object factory and POJO class),
5) Criar outro .ficheiro java em src para operar operação unmarshall, e geri-lo.
Happy Coding !!
Uma coisa que é realmente importante de entender considerando que você tem um arquivo XML como:
<customer id="100">
<Age>29</Age>
<NAME>mkyong</NAME>
</customer>
Lamento informá-lo, mas ...
@XmlElement
public void setAge(int age) {
this.age = age;
}
Não o ajudará, pois tenta procurar por "idade" em vez do nome do elemento "Idade" do XML.
Encorajo-o a indicar manualmente o nome do elemento correspondente ao do ficheiro XML:
@XmlElement(name="Age")
public void setAge(int age) {
this.age = age;
}
E se tiver, por exemplo:
@XmlRootElement
@XmlAccessorType (XmlAccessType.FIELD)
public class Customer {
...
Significa que irá usar feijões java por omissão, e neste momento se você indique que não deve definir outro
@XmlElement(name="NAME")
Anotação acima de um método de setter para um elemento {[5] } vai falhar ao dizer que não pode haver dois elementos em uma única variável.
Espero que ajude.O JAXB é uma escolha fiável, uma vez que faz um mapeamento suave de classes xml para classes java. Mas há outros quadros disponíveis, aqui está um deles:
Acho que {[[0]} é uma boa escolha para serializing/deserializing
feijão com XML.