XML tornou-se agora um formato universal de troca de dados. Sua independência de plataforma, independência de linguagem e independência de sistema trazem grande conveniência para integração e interação de dados. Para obter conhecimento gramatical e detalhes técnicos do próprio XML, você precisa ler literatura técnica relevante, que inclui DOM (Document Object Model), DTD (Document Type Definition), SAX (Simple API for XML), XSD (Xml Schema Definition)) , XSLT (Extensible Stylesheet Language Transformations), para obter detalhes, consulte o documento do site oficial do w3c http://www.w3.org para obter mais informações.
XML é analisado da mesma maneira em linguagens diferentes, mas a sintaxe implementada é diferente. Existem dois métodos básicos de análise, um é chamado SAX e o outro é chamado DOM. SAX é baseado na análise de fluxo de eventos e DOM é baseado na análise de estrutura de árvore de documentos XML. Suponha que o conteúdo e a estrutura do nosso XML sejam os seguintes:
Copie o código do código da seguinte forma:
<?xml versão="1.0" codificação="UTF-8"?>
<funcionários>
<funcionário>
<nome>ddviplinux</nome>
<sex>m</sex>
<idade>30</idade>
</funcionário>
</funcionários>
Este artigo usa a linguagem JAVA para implementar a geração de documentos XML e análise de DOM e SAX.
Primeiro defina uma interface para operar documentos XML, XmlDocument Ele define a interface para criar e analisar documentos XML.
Copie o código do código da seguinte forma:
pacote com.alisoft.facepay.framework.bean;
/**
*
* @autor hongliang.dinghl
* Defina a interface para criação e análise de documentos XML
*/
interface pública XmlDocument {
/**
* Criar documento XML
* @param fileName Caminho completo do arquivo
*/
public void createXml(String nomeArquivo);
/**
* Analisar documentos XML
* @param fileName Caminho completo do arquivo
*/
public void parserXml (String nome do arquivo);
}
1.DOM gera e analisa documentos XML
Um conjunto de interfaces é definido para a versão analisada de um documento XML. O analisador lê o documento inteiro e constrói uma estrutura de árvore residente na memória que o código pode manipular usando a interface DOM. Vantagens: Toda a árvore do documento está na memória, fácil de operar; suporta múltiplas funções como exclusão, modificação e reorganização. Desvantagens: Transferir todo o documento para a memória (incluindo nós inúteis) desperdiça tempo e espaço; também precisa acessar esses dados várias vezes; os recursos de hardware são suficientes (memória, CPU).
Copie o código do código da seguinte forma:
pacote com.alisoft.facepay.framework.bean;
importar java.io.FileInputStream;
importar java.io.FileNotFoundException;
importar java.io.FileOutputStream;
importar java.io.IOException;
importar java.io.InputStream;
importar java.io.PrintWriter;
importar javax.xml.parsers.DocumentBuilder;
importar javax.xml.parsers.DocumentBuilderFactory;
importar javax.xml.parsers.ParserConfigurationException;
importar javax.xml.transform.OutputKeys;
importar javax.xml.transform.Transformer;
importar javax.xml.transform.TransformerConfigurationException;
importar javax.xml.transform.TransformerException;
importar javax.xml.transform.TransformerFactory;
importar javax.xml.transform.dom.DOMSource;
importar javax.xml.transform.stream.StreamResult;
importar org.w3c.dom.Document;
importar org.w3c.dom.Element;
importar org.w3c.dom.Node;
importar org.w3c.dom.NodeList;
importar org.xml.sax.SAXException;
/**
*
* @autor hongliang.dinghl
* Geração de DOM e análise de documentos XML
*/
classe pública DomDemo implementa XmlDocument {
documento de documento privado;
private String nomeArquivo;
public void inicialização() {
tentar {
Fábrica DocumentBuilderFactory = DocumentBuilderFactory
.newInstance();
Construtor DocumentBuilder = factory.newDocumentBuilder();
this.document = construtor.newDocument();
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
}
}
public void createXml(String nome do arquivo) {
Raiz do elemento = this.document.createElement("funcionários");
this.document.appendChild(raiz);
Elemento funcionário = this.document.createElement("funcionário");
Nome do elemento = this.document.createElement("nome");
nome.appendChild(this.document.createTextNode("Ding Hongliang"));
funcionário.appendChild(nome);
Elemento sexo = this.document.createElement("sexo");
sex.appendChild(this.document.createTextNode("m"));
funcionário.appendChild(sexo);
Idade do elemento = this.document.createElement("idade");
idade.appendChild(this.document.createTextNode("30"));
funcionário.appendChild(idade);
root.appendChild(funcionário);
TransformerFactory tf = TransformerFactory.newInstance();
tentar {
Transformador transformador = tf.newTransformer();
Fonte DOMSource = new DOMSource(documento);
transformador.setOutputProperty(OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(OutputKeys.INDENT, "sim");
PrintWriter pw = new PrintWriter(new FileOutputStream(fileName));
Resultado StreamResult = novo StreamResult(pw);
transformer.transform(fonte, resultado);
System.out.println("Arquivo XML gerado com sucesso!");
} catch (TransformerConfigurationException e) {
System.out.println(e.getMessage());
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (TransformerException e) {
System.out.println(e.getMessage());
}
}
public void parserXml(String nome do arquivo) {
tentar {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Documento documento = db.parse(nomeArquivo);
Funcionários da NodeList = document.getChildNodes();
for (int i = 0; i < funcionários.getLength(); i++) {
Nó funcionário = funcionários.item(i);
NodeList funcionárioInfo = funcionário.getChildNodes();
for (int j = 0; j <funcionárioInfo.getLength(); j++) {
Nó nó = funcionárioInfo.item(j);
NodeList funcionárioMeta = node.getChildNodes();
for (int k = 0; k <funcionárioMeta.getLength(); k++) {
System.out.println(employeeMeta.item(k).getNodeName()
+ ":" + funcionárioMeta.item(k).getTextContent());
}
}
}
System.out.println("Análise concluída");
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (ParserConfigurationException e) {
System.out.println(e.getMessage());
} catch (SAXException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
2.SAX gera e analisa documentos XML
Para resolver o problema do DOM, apareceu o SAX. SAX, orientado a eventos. Quando o analisador encontra o início de um elemento, o fim de um elemento, o início ou fim de um texto, um documento, etc., ele envia eventos e os programadores escrevem um código que responde a esses eventos e salva os dados. Vantagens: Não há necessidade de carregar o documento inteiro com antecedência e consome menos recursos. O código do analisador SAX é menor que o código do analisador DOM e é adequado para Applet e download; Desvantagens: não persistente após o evento, se os dados não forem salvos, os dados são perdidos; apenas o texto pode ser obtido do evento, mas não se sabe a qual elemento o texto pertence; Documento XML Pequena quantidade de conteúdo, raramente revisitado;
Código Java
Copie o código do código da seguinte forma:
pacote com.alisoft.facepay.framework.bean;
importar java.io.FileInputStream;
importar java.io.FileNotFoundException;
importar java.io.IOException;
importar java.io.InputStream;
importar javax.xml.parsers.ParserConfigurationException;
importar javax.xml.parsers.SAXParser;
importar javax.xml.parsers.SAXParserFactory;
importar org.xml.sax.Attributes;
importar org.xml.sax.SAXException;
importar org.xml.sax.helpers.DefaultHandler;
/**
*
* @autor hongliang.dinghl
* Análise de documento SAX
*/
classe pública SaxDemo implementa XmlDocument {
public void createXml(String nome do arquivo) {
System.out.println("<<"+nome do arquivo+">>");
}
public void parserXml(String nome do arquivo) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
tentar {
SAXParser saxparser = saxfac.newSAXParser();
InputStream é = new FileInputStream(nomeDoArquivo);
saxparser.parse(é, novo MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
classe MySAXHandler estende DefaultHandler {
booleano hasAttribute = falso;
Atributos atributos = null;
public void startDocument() lança SAXException {
System.out.println("O documento começou a ser impresso");
}
public void endDocument() lança SAXException {
System.out.println("Impressão do documento finalizada");
}
public void startElement(String uri, String localName, String qName,
Atributos atributos) lança SAXException {
if (qNome.equals("funcionários")) {
retornar;
}
if (qNome.equals("funcionário")) {
System.out.println(qNome);
}
if (atributos.getLength() > 0) {
this.attributes = atributos;
this.hasAttribute = verdadeiro;
}
}
public void endElement(String uri, String localName, String qName)
lança SAXException {
if (hasAttribute && (atributos! = null)) {
for (int i = 0; i < atributos.getLength(); i++) {
System.out.println(atributos.getQName(0)
+ atributos.getValue(0));
}
}
}
caracteres públicos vazios (char[] ch, int start, int length)
lança SAXException {
System.out.println(new String(ch, início, comprimento));
}
}
pacote com.alisoft.facepay.framework.bean;
importar java.io.FileInputStream;
importar java.io.FileNotFoundException;
importar java.io.IOException;
importar java.io.InputStream;
importar javax.xml.parsers.ParserConfigurationException;
importar javax.xml.parsers.SAXParser;
importar javax.xml.parsers.SAXParserFactory;
importar org.xml.sax.Attributes;
importar org.xml.sax.SAXException;
importar org.xml.sax.helpers.DefaultHandler;
/**
*
* @autor hongliang.dinghl
* Análise de documento SAX
*/
classe pública SaxDemo implementa XmlDocument {
public void createXml(String nome do arquivo) {
System.out.println("<<"+nome do arquivo+">>");
}
public void parserXml(String nome do arquivo) {
SAXParserFactory saxfac = SAXParserFactory.newInstance();
tentar {
SAXParser saxparser = saxfac.newSAXParser();
InputStream é = new FileInputStream(nomeDoArquivo);
saxparser.parse(é, novo MySAXHandler());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
classe MySAXHandler estende DefaultHandler {
booleano hasAttribute = falso;
Atributos atributos = null;
public void startDocument() lança SAXException {
System.out.println("O documento começou a ser impresso");
}
public void endDocument() lança SAXException {
System.out.println("Impressão do documento finalizada");
}
public void startElement(String uri, String localName, String qName,
Atributos atributos) lança SAXException {
if (qNome.equals("funcionários")) {
retornar;
}
if (qNome.equals("funcionário")) {
System.out.println(qNome);
}
if (atributos.getLength() > 0) {
this.attributes = atributos;
this.hasAttribute = verdadeiro;
}
}
public void endElement(String uri, String localName, String qName)
lança SAXException {
if (hasAttribute && (atributos! = null)) {
for (int i = 0; i < atributos.getLength(); i++) {
System.out.println(atributos.getQName(0)
+ atributos.getValue(0));
}
}
}
caracteres públicos vazios (char[] ch, int start, int length)
lança SAXException {
System.out.println(new String(ch, início, comprimento));
}
}
3.DOM4J gera e analisa documentos XML
DOM4J é uma API Java XML muito excelente, com excelente desempenho, funções poderosas e extrema facilidade de uso. Hoje em dia, você pode ver que cada vez mais software Java está usando DOM4J para ler e escrever XML. Vale a pena mencionar que até mesmo o JAXM da Sun também está usando DOM4J.
Código Java
Copie o código do código da seguinte forma:
pacote com.alisoft.facepay.framework.bean;
importar java.io.File;
importar java.io.FileWriter;
importar java.io.IOException;
importar java.io.Writer;
importar java.util.Iterator;
importar org.dom4j.Document;
importar org.dom4j.DocumentException;
importar org.dom4j.DocumentHelper;
importar org.dom4j.Element;
importar org.dom4j.io.SAXReader;
importar org.dom4j.io.XMLWriter;
/**
*
* @autor hongliang.dinghl
* Dom4j gera documentos XML e analisa documentos XML
*/
A classe pública Dom4jDemo implementa XmlDocument {
public void createXml(String nome do arquivo) {
Documento documento = DocumentHelper.createDocument();
Elemento funcionários=document.addElement("funcionários");
Elemento funcionário=employees.addElement("funcionário");
Nome do elemento = funcionário.addElement("nome");
nome.setText("ddvip");
Elemento sexo=employee.addElement("sexo");
sexo.setText("m");
Elemento idade=employee.addElement("idade");
idade.setText("29");
tentar {
Escritor fileWriter=new FileWriter(fileName);
XMLWriter xmlWriter=novo XMLWriter(fileWriter);
xmlWriter.write(documento);
xmlWriter.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
public void parserXml(String nome do arquivo) {
Arquivo inputXml = novo arquivo (NomeArquivo);
SAXReader saxReader = new SAXReader();
tentar {
Documento documento = saxReader.read(inputXml);
Elemento empregados=document.getRootElement();
for(Iterador i = funcionários.elementIterator(); i.hasNext();){
Elemento funcionário = (Elemento) i.next();
for(Iterador j = funcionário.elementIterator(); j.hasNext();){
Elemento node=(Elemento) j.next();
System.out.println(node.getName()+":"+node.getText());
}
}
} catch (DocumentException e) {
System.out.println(e.getMessage());
}
System.out.println("dom4j parserXml");
}
}
4.JDOM gera e analisa XML
Para reduzir a quantidade de codificação para DOM e SAX, o JDOM tem vantagens: o princípio 20-80 reduz bastante a quantidade de código; Ocasiões de uso: As funções a serem implementadas são simples, como análise, criação, etc., mas no nível inferior, JDOM ainda usa documentos SAX (mais comumente usados), DOM e Xanan.
Copie o código do código da seguinte forma:
pacote com.alisoft.facepay.framework.bean;
importar java.io.FileNotFoundException;
importar java.io.FileOutputStream;
importar java.io.IOException;
importar java.util.List;
importar org.jdom.Document;
importar org.jdom.Element;
importar org.jdom.JDOMException;
importar org.jdom.input.SAXBuilder;
importar org.jdom.output.XMLOutputter;
/**
*
* @autor hongliang.dinghl
* JDOM gera e analisa documentos XML
*
*/
classe pública JDomDemo implementa XmlDocument {
public void createXml(String nome do arquivo) {
Documento documental;
Raiz do elemento;
root=new Element("funcionários");
documento=novo Documento(raiz);
Elemento funcionário=new Elemento("funcionário");
root.addContent(funcionário);
Nome do elemento=novo Elemento("nome");
nome.setText("ddvip");
funcionário.addContent(nome);
Elemento sexo=novo Elemento("sexo");
sexo.setText("m");
funcionário.addContent(sexo);
Idade do elemento=new Elemento("idade");
idade.setText("23");
funcionário.addContent(idade);
XMLOutputter XMLOut = novo XMLOutputter();
tentar {
XMLOut.output (documento, novo FileOutputStream (nome do arquivo));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void parserXml(String nome do arquivo) {
Construtor SAXBuilder = novo SAXBuilder (falso);
tentar {
Documento document=builder.build(nomedoarquivo);
Elemento empregados=document.getRootElement();
Lista funcionárioList=employees.getChildren("funcionário");
for(int i=0;iElement funcionário=(Elemento)employeeList.get(i);
Lista funcionárioInfo=employee.getChildren();
for(int j=0;jSystem.out.println(((Element)employeeInfo.get(j)).getName()+":"+((Element)employeeInfo.get(j)).getValue());
}
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}