Carregando XML com XMLHttpRequest - JavaScript
O formato XML é popular para armazenamento e transmissão de dados. Vamos explorar como carregar um documento XML em uma página web usando uma solicitação AJAX.
Como servidor, usaremos o Node.js, assim como no tema anterior, por ser uma opção simples. No entanto, você pode usar qualquer outra tecnologia de servidor ou servidor web de sua preferência.
Vamos definir uma pasta no disco rígido para o projeto, onde criaremos três arquivos:
: a página principal da aplicaçãoindex.html
: o arquivo XML com os dadosusers.xml
: o arquivo da aplicação servidor, que usará Node.jsserver.js
Definindo os Dados
O arquivo users.xml
<?xml version="1.0" encoding="UTF-8" ?>
<users>
<user name="Tom" age="39">
<contacts>
<email>tom@smail.com</email>
<phone>+1234567890</phone>
</contacts>
</user>
<user name="Bob" age="43">
<contacts>
<email>bob@tmail.com</email>
<phone>+1334567181</phone>
</contacts>
</user>
<user name="Sam" age="28">
<contacts>
<email>sam@xmail.com</email>
<phone>+1434567782</phone>
</contacts>
</user>
</users>
Aqui, o elemento users
user
name
age
user
contacts
phone
email
Definindo o Servidor
O arquivo server.js
const http = require("http");
const fs = require("fs");
http.createServer((request, response) => {
// se os dados XML forem solicitados
if (request.url == "/data") {
fs.readFile("users.xml", (_, data) => response.end(data));
} else {
fs.readFile("index.html", (_, data) => response.end(data));
}
}).listen(3000, () => console.log("Servidor iniciado em http://localhost:3000"));
Vamos analisar o código. Primeiro, importamos os pacotes necessários:
const http = require("http"); // para tratar requisições
const fs = require("fs"); // para ler arquivos do disco rígido
Para criar o servidor, usamos a função http.createServer()
request
response
No manipulador, usamos a propriedade request.url
users.xml
if (request.url == "/data") {
fs.readFile("users.xml", (_, data) => response.end(data));
}
Para ler o arquivo, usamos a função fs.readFile
data
Para todas as outras solicitações, enviamos o arquivo index.html
else {
fs.readFile("index.html", (_, data) => response.end(data));
}
Por fim, usamos a função listen()
Carregando XML na Página Web
Para obter o arquivo users.xml
index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<script>
const xhr = new XMLHttpRequest();
xhr.onload = () => {
if (xhr.status == 200) {
const xml = xhr.responseXML;
console.log(xml);
}
};
xhr.open("GET", "/data"); // Solicitação GET para /data
xhr.responseType = "document"; // Definindo o tipo de resposta
xhr.setRequestHeader("Accept", "text/xml"); // Aceitando apenas XML
xhr.send(); // Enviando a solicitação
</script>
</body>
</html>
Para obter os dados, enviamos uma solicitação para o endereço /data
responseType
document
xhr.responseType = "document";
Além disso, é necessário definir o cabeçalho Accept como "text/xml"
"application/xml"
xhr.setRequestHeader("Accept", "text/xml");
No manipulador do evento onload
responseXML
Document
xhr.onload = () => {
if (xhr.status == 200) {
const xml = xhr.responseXML;
console.log(xml);
}
};
Após definir todos os arquivos, navegamos até a pasta do servidor no console usando o comando cd
node server.js
C:\app>node server.js Servidor iniciado em http://localhost:3000
Depois de iniciar o servidor, podemos acessar a página no navegador em http://localhost:3000
/data
users.xml
Exibindo Dados do Documento XML na Página
Agora vamos supor que precisamos exibir os dados dos usuários do XML em uma tabela na página web. Para isso, vamos alterar o código do index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Programício</title>
</head>
<body>
<div id="content"></div>
<script>
const contentDiv = document.getElementById("content");
const xhr = new XMLHttpRequest();
xhr.onload = () => {
if (xhr.status == 200) {
const xmlDoc = xhr.responseXML;
const table = createTable();
// Seleciona todos os elementos user
const users = xmlDoc.getElementsByTagName("user");
for (let i = 0; i < users.length; i++) {
const user = users[i];
const userName = user.getAttribute("name");
const userAge = user.getAttribute("age");
const contact = user.querySelector("contacts email").textContent;
const row = createRow(userName, userAge, contact);
table.appendChild(row);
}
contentDiv.appendChild(table);
}
};
xhr.open("GET", "/data");
xhr.responseType = "document";
xhr.setRequestHeader("Accept", "text/xml");
xhr.send();
// Cria a tabela
function createTable() {
const table = document.createElement("table");
const headerRow = document.createElement("tr");
const nameColumnHeader = document.createElement("th");
const ageColumnHeader = document.createElement("th");
const contactColumnHeader = document.createElement("th");
nameColumnHeader.appendChild(document.createTextNode("Name"));
ageColumnHeader.appendChild(document.createTextNode("Age"));
contactColumnHeader.appendChild(document.createTextNode("Contacts"));
headerRow.appendChild(nameColumnHeader);
headerRow.appendChild(ageColumnHeader);
headerRow.appendChild(contactColumnHeader);
table.appendChild(headerRow);
return table;
}
// Cria uma linha para a tabela
function createRow(userName, userAge, userContact) {
const row = document.createElement("tr");
const nameColumn = document.createElement("td");
const ageColumn = document.createElement("td");
const contactColumn = document.createElement("td");
nameColumn.appendChild(document.createTextNode(userName));
ageColumn.appendChild(document.createTextNode(userAge));
contactColumn.appendChild(document.createTextNode(userContact));
row.appendChild(nameColumn);
row.appendChild(ageColumn);
row.appendChild(contactColumn);
return row;
}
</script>
</body>
</html>
Nesse caso, carregamos a tabela na página dentro do elemento com o identificador content
contentDiv
const contentDiv = document.getElementById("content");
Para criar a tabela, definimos duas funções auxiliares. A função createTable
table
createRow
Na parte principal do código, fazemos a solicitação ao servidor. Como a resposta do servidor será um documento XML do tipo Document
getElementsByTagName
querySelector
user
const xmlDoc = xhr.responseXML;
const table = createTable();
// Seleciona todos os elementos user
const users = xmlDoc.getElementsByTagName("user");
Em seguida, percorremos todos os elementos user
name
age
email
for (let i = 0; i < users.length; i++) {
const user = users[i];
const userName = user.getAttribute("name");
const userAge = user.getAttribute("age");
const contact = user.querySelector("contacts email").textContent;
const row = createRow(userName, userAge, contact);
table.appendChild(row);
}
Para cada elemento user, criamos uma linha que é adicionada à tabela.
Dessa forma, ao acessar a página index.html