CodeGym /Blogue Java /Random-PT /XML em Java
John Squirrels
Nível 41
San Francisco

XML em Java

Publicado no grupo Random-PT
Oi! Hoje vamos apresentar outro formato de dados chamado XML. Este é um tópico muito importante. Ao trabalhar em aplicativos Java reais, é quase certo que você encontrará tarefas relacionadas a XML. No desenvolvimento Java, esse formato é usado quase universalmente (descobriremos o porquê abaixo), então eu recomendo que você não revise esta lição superficialmente, mas obtenha um entendimento completo de tudo e também estude literatura/links adicionais :) Este definitivamente não será uma perda de tempo. Então, vamos começar com as coisas fáceis: o "o quê" e o "porquê"!

O que é JavaXML?

XML significa eXtensible Markup Language. Você já deve estar familiarizado com uma linguagem de marcação — você já ouviu falar de HTML, que é usado para criar páginas da web :) O que é XML?  - 1HTML e XML até têm uma aparência semelhante:
HTML 1

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 1

<headline>title</headline>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
HTML 2

<h1>title</h1>
<p>paragraph</p>
<p>paragraph</p>
XML 2

<chief>title</chief>
<paragraph>paragraph<paragraph>
<paragraph>paragraph<paragraph>
Em outras palavras, XML é uma linguagem para descrever dados.

Por que você precisa de XML?

O XML foi originalmente inventado para armazenar e enviar dados de maneira mais conveniente, inclusive pela Internet. Tem várias vantagens que ajudam você a conseguir isso. Primeiro, é fácil de ler tanto por um ser humano quanto por um computador. Acho que você pode entender facilmente o que este arquivo XML descreve:

<?xml version="1.0" encoding="UTF-8"?>
<book>
   <title>Harry Potter and the Philosopher’s Stone</title>
   <author>J. K. Rowling</author>
   <year>1997</year>
</book>
Um computador também entende facilmente esse formato. Em segundo lugar, como os dados são armazenados como texto simples, não haverá problemas de compatibilidade quando os transferirmos de um computador para outro. É importante entender que XML não é um código executável — é uma linguagem de descrição de dados. Depois de descrever os dados usando XML, você precisa escrever o código (por exemplo, em Java) que pode enviar/receber/processar esses dados.

Como o XML é estruturado?

O componente principal são as tags: estas são as coisas entre colchetes angulares:

<book>
</book>
Existem tags de abertura e tags de fechamento. A tag de fechamento possui um símbolo adicional (" / "), como pode ser visto no exemplo acima. Cada tag de abertura deve ter uma tag de fechamento. Eles mostram onde começa e termina a descrição de cada elemento no arquivo. As tags podem ser aninhadas! Em nosso exemplo de livro, a tag <book> tem 3 tags aninhadas: <title>, <author> e <year>. Isso não está limitado a um nível de aninhamento: tags aninhadas podem ter suas próprias tags aninhadas, etc. Essa estrutura é chamada de árvore de tags. Vejamos esta árvore usando um exemplo de arquivo XML que descreve uma concessionária de carros:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
Aqui temos uma tag de nível superior: <carstore>. Também é chamado de elemento raiz. <carstore> tem uma tag filha: <car>. <car>, por sua vez, também possui 3 tags filhas: <model>, <year> e <price>. Cada tag pode ter atributos, que contêm informações adicionais importantes. Em nosso exemplo, a tag <model> possui um atributo "lang", que indica o idioma usado para gravar o nome do modelo:

<model lang="en">Scania R 770</model>
Aqui indicamos que o nome está escrito em inglês. Nossa tag <price> tem um atributo "currency".

<price currency="US dollar">150000.00</price>
Aqui indicamos que o preço do carro é dado em dólares americanos. Assim, XML tem uma sintaxe "autodescritiva". Você pode adicionar qualquer informação necessária para descrever os dados. Além disso, na parte superior do arquivo, você pode adicionar uma linha indicando a versão do XML e a codificação usada para gravar os dados. Isso é chamado de "prólogo" e se parece com isso:

<?xml version="1.0" encoding="UTF-8"?>
Estamos usando XML versão 1.0 e codificação UTF-8. Isso não é necessário, mas pode ser útil se, por exemplo, seu arquivo usar texto em idiomas diferentes. Mencionamos que XML significa "eXtensible Markup Language", mas o que significa "extensible"? Isso significa que é perfeito para criar novas versões de seus objetos e arquivos. Por exemplo, suponha que queremos também começar a vender motocicletas em nossa concessionária! Dito isso, precisamos que nosso programa suporte ambas as versões de <carstore>: a antiga (sem motocicletas) e a nova. Aqui está a nossa versão antiga:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
</carstore>
E aqui está o novo expandido:

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">20000.00</price>
   </car>
   <car category="sport">
       <title lang="en">Ferrari 360 Spider</title>
       <year>2018</year>
       <price currency="US dollar">150000.00</price>
   </car>
   <motorcycle>
       <title lang="en">Yamaha YZF-R6</title>
       <year>2018</year>
       <price currency="Russian Ruble">1000000.00</price>
       <owner>Vasia</owner>
   </motorcycle>
   <motorcycle>
       <title lang="en">Harley Davidson Sportster 1200</title>
       <year>2011</year>
       <price currency="Euro">15000.00</price>
       <owner>Petia</owner>
   </motorcycle>
</carstore>
É fácil e simples adicionar uma descrição de motocicletas ao nosso arquivo :) Além disso, não precisamos absolutamente ter as mesmas etiquetas filhas para motocicletas e carros. Observe que as motocicletas, ao contrário dos carros, possuem um elemento <owner>. Isso não impede que o computador (ou humano) leia os dados.

Diferenças entre XML e HTML

Já dissemos que XML e HTML são muito semelhantes na aparência. Isso torna muito importante saber como eles diferem. Primeiro, eles são usados ​​para propósitos diferentes. HTML é para marcar páginas da web. Por exemplo, ao criar um site, você pode usar HTML para especificar: "O menu deve estar no canto superior direito. Ele deve ter tais e tais botões". Em outras palavras, o trabalho do HTML é exibir dados. XML é para armazenar e enviar informações em um formato conveniente para humanos e computadores. Este formato não contém nenhuma indicação de como estes dados devem ser exibidos: isso depende do código do programa que os lê. Em segundo lugar, há uma grande diferença técnica. As tags HTML são predefinidas. Em outras palavras, criar um cabeçalho HTML (por exemplo, uma legenda grande na parte superior da página) usa apenas <h1></h1> tags (<h2></h2> e <h3></h3> são usadas para cabeçalhos menores). Você não pode criar cabeçalhos HTML usando outras tags. XML não usa marcas predefinidas. Você pode dar às tags o nome que quiser: <header>, <title>, <idontknow2121>.

Resolução de conflitos

A liberdade que o XML oferece pode levar a alguns problemas. Por exemplo, uma mesma entidade (por exemplo, um carro) pode ser usada por um programa para diferentes propósitos. Por exemplo, temos um arquivo XML que descreve carros. No entanto, nossos programadores não chegaram a um acordo prévio entre si. E agora, além dos dados sobre carros reais, podemos encontrar dados sobre carrinhos de brinquedo em nosso XML! Além disso, eles têm os mesmos atributos. Digamos que nosso programa leia esse arquivo XML. Como podemos distinguir um carro real de um carro de brinquedo?

<?xml version="1.0" encoding="UTF-8"?>
<carstore>
   <car category="truck">
       <model lang="en">Scania R 770</model>
       <year>2005</year>
       <price currency="US dollar">200000.00</price>
   </car>
   <car category="sedan">
       <title lang="en">Ford Focus</title>
       <year>2012</year>
       <price currency="US dollar">100.00</price>
   </car>
</carstore>
Aqui, os prefixos e o namespace nos ajudarão. Para distinguir os carros de brinquedo dos reais em nosso programa (e de fato quaisquer brinquedos de suas contrapartes reais), introduzimos dois prefixos: "real" e "brinquedo".

<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
Agora nosso programa será capaz de distinguir entre as diferentes entidades! Tudo o que tiver o prefixo brinquedo será tratado como brinquedo :) Porém, ainda não terminamos. Para usar prefixos, precisamos registrar cada um deles como um namespace. Na verdade, "registrar" é uma palavra forte :) Simplesmente precisamos criar um nome exclusivo para cada um deles. É como nas classes: uma classe tem um nome curto ( Cat ) e um nome totalmente qualificado que inclui todos os pacotes ( zoo.animals.Cat). Um URI geralmente é usado para criar um nome de namespace exclusivo. Às vezes, isso é feito usando um endereço da Internet, onde são descritas as funções desse namespace. Mas não precisa ser um endereço de Internet válido. Muitas vezes, os projetos simplesmente usam strings semelhantes a URI que ajudam a rastrear a hierarquia de namespace. Aqui está um exemplo:

<?xml version="1.0" encoding="UTF-8"?>
<carstore xmlns:real="http://testproject.developersgroup1.companyname/department2/namespaces/real"
         xmlns:toy="http://testproject.developersgroup1.companyname/department2/namespaces/toy">
<real:car category="truck">
   <model lang="en">Scania R 770</model>
   <year>2005</year>
   <price currency="US dollar">200000.00</price>
</real:car>
<toy:car category="sedan">
   <title lang="en">Ford Focus</title>
   <year>2012</year>
   <price currency="US dollar">100.00</price>
</toy:car>
</carstore>
Claro, não há site em "http://testproject.developersgroup1.companyname/department2/namespaces/real" Mas esta string contém informações úteis: os desenvolvedores do Grupo 1 no Departamento 2 são responsáveis ​​por criar o namespace "real" . Se precisarmos apresentar novos nomes ou discutir possíveis conflitos, saberemos a quem recorrer. Às vezes, os desenvolvedores usam um endereço da Web descritivo real como um nome de namespace exclusivo. Por exemplo, pode ser o caso de uma grande empresa cujo projeto será utilizado por milhões de pessoas em todo o mundo. Mas isso certamente nem sempre é feito: o Stack Overflow tem uma discussão sobre esse assunto. Em geral, não há nenhum requisito estrito para usar URIs como nomes de namespace: você também pode simplesmente usar strings aleatórias. Esta opção também funcionaria:

xmlns:real="nvjneasiognipni4435t9i4gpojrmeg"
Dito isso, usar um URI tem várias vantagens. Você pode ler mais sobre isso aqui .

Padrões XML básicos

Os padrões XML são um conjunto de extensões que adicionam funcionalidade extra aos arquivos XML. O XML tem muitos padrões, mas veremos apenas os mais importantes e descobriremos que eles tornam possível o AJAX, que é um dos padrões XML mais famosos. Ele permite que você altere o conteúdo de uma página da web sem recarregá-la! XSLT permite converter texto XML em outros formatos. Por exemplo, você pode usar XSLT para converter XML em HTML! Como dissemos, o objetivo do XML é descrever dados, não exibi-los. Mas com XSLT podemos contornar essa limitação! O XML DOM permite recuperar, modificar, adicionar ou excluir elementos individuais de um arquivo XML. Aqui está um pequeno exemplo de como isso funciona. Temos um arquivo books.xml:

<bookstore>
   <book category="cooking">
       <title lang="en">Everyday Italian</title>
       <author>Giada De Laurentiis</author>
       <year>2005</year>
       <price>30.00</price>
   </book>
   <book category="children">
       <title lang="en">Harry Potter</title>
       <author>J. K. Rowling</author>
       <year>2005</year>
       <price>29.99</price>
   </book>
</bookstore>
Tem dois livros. Os livros têm um elemento <title>. Aqui podemos usar JavaScript para obter todos os títulos de livros de nosso arquivo XML e imprimir o primeiro no console:

<!DOCTYPE html>
<html>
<body>

<p id="demo"></p>

<script>
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
  myFunction(this);
  }
};
xhttp.open("GET", "books.xml", true);
xhttp.send();

function myFunction(xml) {
    var xmlDoc = xml.responseXML;
  document.getElementById("demo").innerHTML =
  xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue;
}
</script>

</body>
</html>
DTD ("definição de tipo de documento") permite definir uma lista de elementos permitidos para uma entidade em um arquivo XML. Por exemplo, suponha que estejamos trabalhando em um site de livraria e que todas as equipes de desenvolvimento concordem que apenas os atributos título, autor e ano devem ser especificados para os elementos do livro nos arquivos XML. Mas como nos protegemos do descuido? Muito fácil!

<?xml version="1.0"?>
<!DOCTYPE book [
       <!ELEMENT book (title,author,year)>
       <!ELEMENT title (#PCDATA)>
       <!ELEMENT author (#PCDATA)>
       <!ELEMENT year (#PCDATA)>
       ]>

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
</book>
Aqui definimos uma lista de atributos válidos para <book>. Tente adicionar um novo elemento lá e você receberá um erro imediatamente!

<book>
   <title>The Lord of The Rings</title>
   <author>John R.R. Tolkien</author>
   <year>1954</year>
   <mainhero>Frodo Baggins</mainhero>
</book>
Erro! "O elemento mainhero não é permitido aqui" Existem muitos outros padrões XML. Você pode se familiarizar com cada um deles e tentar se aprofundar no código. De qualquer forma, se você precisar de informações sobre XML, poderá encontrar quase tudo lá :) E com isso nossa aula chega ao fim. É hora de voltar às tarefas! :) Até a próxima vez!
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION