UNIPÊ Centro Universitário de João Pessoa Desenvolvimento para Web - XML Manipulação de XML JAXP - DOM Prof. Eduardo Ribas ducaribas@gmail.com 1 4 JAXP DOM
O que é DOM? Document Object Model API padrão para processamento de dados XML; Baseado em um modelo de árvore: o parser constrói na memória uma estrutura de objetos representando a árvore XML (objetos DOM). Padrão desenvolvido pela W3C; Define um conjunto de interfaces para a construção e tratamento de instâncias de documentos. 2
O que é DOM? DOM foi projetado orientado a objetos: Uso de linguagens com suporte a programação OO (e.g. Java ou C++). O padrão e composto por um conjunto de interfaces; Java: org.w3c.dom Cada parser particular implementa estas interfaces; O desenvolvedor de aplicações usa apenas as interfaces. 3
JAXP Java API for XML Processing http://java.sun.com/webservices/jaxp/index.jsp É uma API padrão da SUN para a manipulação de dados em XML com Java; Implementa o modelo DOM da W3C. 4
JAXP: Exemplo // Arquivo contendo o documento XML. File docxmlfile = new File("arquivo.xml"); - Executa o parsing; - Constrói o objeto DOM na memória; // Obtem - Retorna o uma parser referência do arquivo ao nodo documento. XML e realiza a traducao. DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = fac.newdocumentbuilder(); Document doc = docbuilder.parse(docxmlfile);... 5
DOM: Nodo DOM define interfaces para manipular nodos Nodos Representam elementos, texto, comentários, instruções de processamento, seções CDATA, atributos, e etc. 6
DOM: Exemplo <!DOCTYPE pedido SYSTEM "pedido.dtd"> <pedido numero="1001"> <cliente> <razao_social>joaquim</razao_social> <cgc>00.000.000/0001-00</cgc> </cliente> <itens_pedido> <item> <produto>caneta azul</produto> <quantidade>100</quantidade> <preco_unit>2</preco_unit> </item> <item> <produto>caneta preta</produto> <quantidade>200</quantidade> <preco_unit>3</preco_unit> </item> </itens_pedido> </pedido> 7
DOM: Exemplo 8
DOM: Exemplo Executando... java MostraConteudoDOM exemplo1.xml Para cada nodo do documento, o seguinte código é executado: System.out.print(n.getNodeName() + "=>" + n.getnodevalue() + " "); 9
DOM: Exemplo pedido=>null #text=> cliente=>null #text=> razao_social=>null #text=>joaquim #text=> cgc=>null #text=>00.000.000/0001-00 #text=> #text=> itens_pedido=>null #text=> item=>null #text=> produto=>null #text=>caneta azul #text=> quantidade=>null #text=>100 #text=> preco_unit=>null #text=>2 #text=> #text=> item=>null #text=> produto=>null #text=>caneta preta #text=> quantidade=>null #text=>200 #text=> preco_unit=>null #text=>3 #text=> #text=> #text=> 10
DOM: Interfaces 11
DOM: Interfaces Node Métodos relacionados: Características de um nodo (nome, tipo, valor, etc.) Navegação na arvore (pai, filhos, irmãos, etc.) Manipulação de nodos (inserir, atualizar, remover, etc.) 12
DOM: Interfaces Node Cada nodo pode ser um (getnodetype()): Element Attribute Text Comment Processing Instruction etc. 13
DOM: Interfaces Node Cada nodo possui um nome (getnodename()): Se o nodo é do tipo elemento é o nome do elemento; Se nodo é do tipo comentário é #comment; Se nodo é do tipo texto é #text; Se nodo e do tipo atributo é o nome do atributo. 14
DOM: Interfaces Node Muitos tipos de nodos não podem ter filhos, por exemplo: Comentário Instrução de Processamento Atributo 15
DOM: Interfaces Métodos da Interface Node: NamedNodeMap getattributes(): Retorna a lista de atributos do nodo (para elemento) ou null caso contrario. NodeList getchildnodes(): Retorna uma lista de todos os filhos do nodo. String getlocalname(): Retorna o nome (sem o prefixo do namespace) do nodo. String getnamespaceuri(): Retorna a URI do namespace do nodo, ou null se o namespace não tiver sido especificado. String getnodename(): Retorna o nome do nodo, dependendo do tipo do nodo. short getnodetype(): Retorna um código que representa o tipo do nodo. 16
DOM: Interfaces Métodos da Interface Node: String getnodevalue() Document getownerdocument() String getprefix() String gettextcontent() Boolean hasattributes() Boolean haschildnodes() 17
DOM: Interfaces Métodos para navegação na Interface Node: Node getfirstchild(): Retorna o primeiro filho do nodo. Node getlastchild(): Retorna o último filho do nodo. Node getnextsibling(): Retorna o nodo imediatamente após o nodo atual. Node getprevioussibling(): Retorna o nodo imediatamente anterior ao nodo atual. Node getparentnode(): Retorna o pai do nodo atual. NodeList getchildnodes(): Retorna os filhos do nodo atual. 18
DOM: Interfaces Métodos (navegação) da Interface Node: 19
DOM: Interfaces Exemplo: if (mynode.haschildnodes()) { Node firstchild = mynode.getfirstchild(); Node secondchild = firstchild.getnextsibling(); } Se o nodo possui filhos, as referências ao primeiro e ao segundo filho são obtidas. A segunda referência será nula se mynode possui apenas um filho. 20
DOM: Analisando Código... public static void main(string... args) { try { if (args.length!= 1) { System.err.println( "Usage: java MostraConteudoDOM arquivo"); System.exit(1); } DocumentBuilderFactory b = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = b.newdocumentbuilder(); Document mydoc = builder.parse(args[0]); Element raiz = mydoc.getdocumentelement(); } imprimefilhos(raiz); } catch (Exception e) { System.out.println(e.toString()); } 21
DOM: Analisando Código... public static void imprimefilhos(node n) { System.out.print(n.getNodeName() + "=>" + n.getnodevalue() + " "); } if (n.haschildnodes()) { NodeList nl = n.getchildnodes(); for (int i = 0; i < nl.getlength(); i++) { imprimefilhos(nl.item(i)); } } 22
DOM: Interfaces Interfaces Utilitárias a Node: NodeList: Obtido, por exemplo, de getchildnodes(); int getlength(): Retorna o numero de nodos na lista. Node item(int i): Retorna o i-ésimo item na lista. NamedNodeMap: Obtido, por exemplo, de getattributes(); int getlength(): Retorna o número de nodos no mapa. Node getnameditem(string name): Recupera um nodo especificado por um nome. 23
DOM: Interfaces Métodos para manipulação na Interface Node: Existem métodos para realizar diferentes operações com nodos, tais como: Remover; Adicionar; Substituir; Clonar nodos. 24
DOM: Interfaces E a criação dos objetos Node???? Node, Element e etc. são interfaes! Objeto Document é responsável por todas as criações. Element createelement(string name); Attribute createattribute(string name); Comment createcomment(string contents); etc. 25
DOM: Interfaces Métodos para manipulação na Interface Node: Node appendchild(node newchild): Adiciona um nodo no final da lista de filhos do nodo atual. Node clonenode(boolean deep): Retorna uma copia do nodo. O parâmetro indica se os descendentes devem ou não serem clonados também. Node insertbefore(node newchild, Node refchild): Insere um nodo antes do nodo refchild. Node removechild(node oldchild): Remove um nodo. Node replacechild(node newchild, Node oldchild): Substitui o nodo oldchild por newchild, e retorna uma referencia para oldchild. 26
DOM: Exemplo Node theparent =...; Node addednode = theparent.appendchild( mydoc.createelement("primeirono")); theparent.removechild(addednode); theparent.appendchild(addednode); Node othernode = theparent.insertbefore( mydoc.createelement("segundono"), addednode); theparent.appendchild(mydoc.createelement("terceirono")); 27
DOM: Exercício Altere a classe de MostraConteudoDOM.java de forma que altere o arquivo pedido.xml da seguinte forma: Insira um atributo novo de nome RG e valor 000000-0 no elemento cliente ; Insira mais um item ao elemento itens_pedido ; Remova o primeiro item de itens_pedido ; Imprima árvore DOM antes e depois do trecho com as alterações. 28
DOM: Validação Para fazer o parser com validação (DTD), duas coisas devem ser feitas: Configurar a validação: DocumentBuilderFactory b = DocumentBuilderFactory.newInstance(); b.setvalidating(true); Construir um handler para os erros. 29
DOM: Validação DocumentBuilderFactory b = DocumentBuilderFactory.newInstance(); b.setvalidating(true); DocumentBuilder builder = b.newdocumentbuilder(); builder.seterrorhandler(new ErrorHandler() { public void error(saxparseexception exception) throws SAXException { System.out.println("Error: " + exception.getmessage()); } public void fatalerror(saxparseexception exception) throws SAXException { System.out.println("Fatal Error: " + exception.getmessage()); } public void warning(saxparseexception exception) throws SAXException { System.out.println("Warning: " + exception.getmessage()); } }); 30
DOM: Exemplo Executando... java MostraConteudoValidatingDOM exemplo1.xml Antes de imprimir o conteúdo a seguinte mensagem de erro aparecerá: Error: The content of element type "cliente" is incomplete, it must match "(razao_social,cgc,endereco)". Altere o arquivo acrescentando outros erros em relação a seu DTD. Por exemplo, troque cliente por client. 31
DOM: Exercício Baseado em MostraConteudoDOM.java, construa uma classe que processe o arquivo pedido.xml e imprima uma nota fiscal como a seguinte: ABC 00.000.000/0001-00 Rua das Flores, 75 Porto Alegre RS ------------------------------------------------------ Produto Quant P.Unit. P.Total ------------------------------------------------------ caneta azul 100 2 200 papel 100 8 800 ------------------------------------------------------ TOTAL: 1000 32