Em Java, existem duas maneiras de analisar nativamente documentos XML, a saber: análise Dom e análise Sax.
A função de análise Dom é poderosa e pode ser adicionada, excluída, modificada e verificada durante a operação, o documento XML será lido na memória na forma de um objeto de documento, por isso é adequado para documentos pequenos.
A análise Sax lê o conteúdo linha por linha e elemento por elemento do início ao fim. É mais inconveniente de modificar, mas é adequado para grandes documentos somente leitura.
Este artigo explica principalmente a análise do Sax, e o restante será colocado posteriormente.
Sax usa uma abordagem orientada a eventos para analisar documentos. Simplificando, é como assistir a um filme no cinema. Você pode assisti-lo do começo ao fim sem voltar atrás (Dom pode lê-lo de um lado para o outro).
No processo de assistir a um filme, cada vez que você se depara com uma trama, uma lágrima ou um encontro ombro a ombro, você mobilizará seu cérebro e seus nervos para receber ou processar essa informação.
Da mesma forma, durante o processo de análise do Sax, a leitura do início e do fim do documento e do início e do fim do elemento acionará alguns métodos de retorno de chamada. Você pode executar o processamento de eventos correspondente nesses métodos de retorno de chamada.
Os quatro métodos são: startDocument(), endDocument(), startElement(), endElement
Além disso, não basta ler o nó. Também precisamos do método caracteres() para processar cuidadosamente o conteúdo contido no elemento.
Ao reunir esses métodos de callback, uma classe é formada, que é o gatilho que precisamos.
Geralmente, o documento é lido no método Main, mas o documento é processado no gatilho. Este é o chamado método de análise orientado a eventos.
Conforme mostrado acima, no gatilho, ele primeiro começa a ler o documento e depois começa a analisar os elementos um por um. O conteúdo de cada elemento será retornado ao método caracteres().
Em seguida, encerre a leitura do elemento. Após a leitura de todos os elementos, encerre a análise do documento.
Agora começamos a criar a classe trigger. Para criar esta classe, primeiro precisamos herdar DefaultHandler.
Crie SaxHandler e substitua o método correspondente:
classe pública SaxHandler estende DefaultHandler {
/* Este método possui três parâmetros
arg0 é a matriz de caracteres retornada, que contém o conteúdo do elemento
arg1 e arg2 são as posições inicial e final do array respectivamente*/
@Substituir
caracteres públicos vazios (char[] arg0, int arg1, int arg2) lança SAXException {
Conteúdo da string = new String(arg0, arg1, arg2);
System.out.println(conteúdo);
super.caracteres(arg0, arg1, arg2);
}
@Substituir
public void endDocument() lança SAXException {
System.out.println("/n...Fim do documento de análise...");
super.endDocument();
}
/* arg0 é o namespace
arg1 é o rótulo que contém o namespace ou vazio se não houver namespace
arg2 é um rótulo sem namespace*/
@Substituir
public void endElement(String arg0, String arg1, String arg2)
lança SAXException {
System.out.println("Fim do elemento de análise" + arg2);
super.endElement(arg0, arg1, arg2);
}
@Substituir
public void startDocument() lança SAXException {
System.out.println("…………Iniciar análise do documento………/n");
super.startDocument();
}
/*arg0 é o namespace
arg1 é o rótulo que contém o namespace ou vazio se não houver namespace
arg2 é o rótulo sem namespace
arg3 é obviamente uma coleção de atributos*/
@Substituir
public void startElement(String arg0, String arg1, String arg2,
Atributos arg3) lança SAXException {
System.out.println("Iniciar análise de elementos" + arg2);
if (arg3! = nulo) {
for (int i = 0; i < arg3.getLength(); i++) {
// getQName() é para obter o nome do atributo,
System.out.print(arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(arg2 + ":");
super.startElement(arg0, arg1, arg2, arg3);
}
}
importar javax.xml.parsers.SAXParser;
importar javax.xml.parsers.SAXParserFactory;
classe pública TesteDemo {
public static void main(String[] args) lança exceção {
// 1. Instancie o objeto SAXParserFactory
Fábrica SAXParserFactory = SAXParserFactory.newInstance();
// 2. Crie um analisador
Analisador SAXParser = factory.newSAXParser();
// 3. Obtenha o documento que precisa ser analisado, gere um analisador e, finalmente, analise o documento
Arquivo f = novo Arquivo("livros.xml");
SaxHandler dh = new SaxHandler();
analisador.parse(f, dh);
}
}
Comece a analisar os livros de elementos
livros:
Comece a analisar o livro de elementos
id="001"livro:
Comece a analisar o título do elemento
título:Harry Potter
Finalizar título do elemento de análise
Comece a analisar o autor do elemento
autor: J K. Rowling
Finalizar autor do elemento de análise
Fim do livro de elementos de análise
Comece a analisar o livro de elementos
id="002"livro:
Comece a analisar o título do elemento
título:Aprendendo XML
Finalizar título do elemento de análise
Comece a analisar o autor do elemento
autor:Erik T. Ray
Finalizar autor do elemento de análise
Fim do livro de elementos de análise
Finalizar análise de livros de elementos
…………Fim do documento de análise…………
Para executar este processo de forma mais clara, também podemos reescrever SaxHandler para restaurar o documento xml original
Classe SaxHandler substituída:
classe pública SaxHandler estende DefaultHandler {
@Substituir
caracteres públicos vazios (char[] arg0, int arg1, int arg2) lança SAXException {
System.out.print(nova String(arg0, arg1, arg2));
super.caracteres(arg0, arg1, arg2);
}
@Substituir
public void endDocument() lança SAXException {
System.out.println("/n termina a análise");
super.endDocument();
}
@Substituir
public void endElement(String arg0, String arg1, String arg2)
lança SAXException {
System.out.print("</");
System.out.print(arg2);
System.out.print(">");
super.endElement(arg0, arg1, arg2);
}
@Substituir
public void startDocument() lança SAXException {
System.out.println("Iniciar análise");
String s = "<?xml versão=/"1.0/" codificação=/"UTF-8/"?>";
System.out.println(s);
super.startDocument();
}
@Substituir
public void startElement(String arg0, String arg1, String arg2,
Atributos arg3) lança SAXException {
System.out.print("<");
System.out.print(arg2);
if (arg3! = nulo) {
for (int i = 0; i < arg3.getLength(); i++) {
System.out.print(" " + arg3.getQName(i) + "=/"" + arg3.getValue(i) + "/"");
}
}
System.out.print(">");
super.startElement(arg0, arg1, arg2, arg3);
}
}
Parece muito melhor agora e restaurá-lo ilustra melhor seu processo de análise.