XML Prof. Júlio Machado [email protected] PROCESSAMENTO Análise Sintática • Para ler e analisar o conteúdo de um documento XML, utiliza-se um analisador sintático para XML – Analisadores sintáticos (ou parsers) são programas que lêem um documento, verificam se está sintaticamente correto e realizam alguma ação à medida que processam o documento Análise Sintática • Há dois tipos de analisadores sintáticos muito utilizados com XML: – Streaming • SAX – “Simple API to XML” • StAX – “Streaming API for XML” – Árvore • DOM – “Document Object Model” Análise Sintática • Streaming – O documento XML é lido por um parser, que identifica cada elemento no momento em que é encontrado, fazendo uma chamada para um método especificado pelo programador enquanto o documento é lido • Dispara um evento – São mais eficientes para tratar grandes documentos Análise Sintática • Árvore – O documento XML é armazenado na memória num formato de árvore de nodos, todos descendendo de uma raiz – O programador pode então aplicar vários métodos para localizar e manipular os nodos – São mais fáceis de utilizar pois fornecem uma visão completa dos dados Análise Sintática • Sun fornece a especificação JAXP em Java – “Java API for XML Processing” – Disponível a partir do Java 1.4 – Diferentes modelos de processamento – Pacotes: • • • • • javax.xml.parsers org.w3c.dom org.xml.sax javax.xml.transform javax.xml.stream Trabalhando com o DOM • DOM modela uma fonte XML na memória como uma árvore de nós • Podemos usar DOM para: – Navegar – Buscar – Modificar o conteúdo DocumentNode ElementNode <City> ElementNode <Name> lcid=“en-US” <city> <name lcid=“en-US”> Seattle </name> </city> AttributeNode TextCharacterData Seattle Trabalhando com o DOM • Para ler um documento XML: – Obter um objeto factory via DocumentBuilderFactory – Obter um objeto DocumentBuilder • Capacidade de ler arquivos, URL ou fluxos – Ler o documento via método parse obtendo um objeto Document Trabalhando com o DOM Trabalhando com o DOM • Exemplo: DocumentBuilder builder; DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); String location = "http://myserver/mycontent.xml"; try { builder = factory.newDocumentBuilder(); Document document = builder.parse(location); } catch (SAXException se) { // tratar erro } catch (IOException ioe) { // tratar erro } catch (ParserConfigurationException pce) { // tratar errro } Trabalhando com o DOM • Para processar a árvore DOM: – A árvore é composta de objetos Node • Principais tipos são Element e Text – Obter primeiro o elemento raiz via método getDocumentElement – Utilizar um objeto NodeList para visitar os nodos filhos de um elemento • Obter via método getChildNodes de Element • Método getLength retorna o tamanho da lista • Método item retorna o elemento armazenado em uma determinada posição Trabalhando com o DOM • Exemplo: Element root = document.getDocumentElement(); NodeList nodes = root.getChildNodes(); for (int i=0; i<nodes.getLength(); i++) { Node childNode = nodes.item(i); ... } Trabalhando com o DOM • Para processar a árvore DOM (cont.): – Para obter um nome de um elemento utilize o método getTagName – Para ler o texto de um elemento utilize o método getFirstChild para obter um elemento Text e depois utilize o método getData para obter o texto – Para obter a lista de atributos utilize um objeto NamedNodeMap retornado pelo método getAttributes • Método item retorna retorna um objeto Node representando o atributo • Método getNodeName retorna o nome do atributo • Método getNodeValue retorna o valor do atributo Trabalhando com o DOM • Para criar uma árvore DOM: – Obter um objeto factory via DocumentBuilderFactory – Obter um objeto DocumentBuilder – Obter um objeto Document via método newDocument Trabalhando com o DOM • Exemplo: DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.newDocument(); Trabalhando com o DOM • Para criar uma árvore DOM (cont.): – Objeto Document possui métodos para criar nodos de elementos e texto • Método createElement cria um novo elemento • Método createTextNode cria um novo texto – Para adicionar um elemento na árvore utilize o método appendChild – Para adicionar um atributo a um elemento utilize o método setAttribute Trabalhando com o DOM • Exemplo: Element product = document.createElement("product"); Element description = document.createElement("description"); Text descriptionText = document.createTextNode("Borracha"); Element price = document.createElement("price"); Text priceText = document.createTextNode("1.99"); price.setAttribute("currency","BRL"); product.appendChild(description); description.appendChild(descriptionText); product.appendChild(price); price.appendChild(priceDescription); Trabalhando com o DOM • Para gerar XML a partir do DOM: – Obter um objeto DOMImplementation via método getImplementation de Document – Obter um objeto DOMImplementationLS capaz de gerar um objeto de escrita XML via método getFeatures – Obter um um objeto LSSerializer capaz de serializar o DOM em XML via método createLSSerializer – Escrever a saída XML via métodos write Trabalhando com o DOM • Exemplo: Document doc = … DOMImplementation impl = doc.getImplementation(); DOMImplementationLS implLS = (DOMImplementationLS) impl.getFeature("LS", "3.0"); LSSerializer ser = implLS.createLSSerializer(); String out = ser.writeToString(doc); JavaBeans - Persistência • A arquitetura dos JavaBeans permite armazenamento e recuperação do estado de um objeto em XML • Classe deve implementar uma das interfaces – java.io.Serializable (serialização automática) – java.io.Externalizable (serialização customizada) JavaBeans - Persistência • Serialização automática – Classe deve possuir um construtor vazio – Campos static ou transient não são serializados – Propriedades públicas serão serializadas em XML JavaBeans - Persistência • Persistência em XML – Persistência de longo termo se refere à persistência em arquivos XML • Ao contrário da serialização binária, que é muito dependente de versão – Java fornece objetos • XMLEncoder – escreve objetos em XML • XMLDecoder – recupera objeto do XML JavaBeans - Persistência • XMLEncoder: XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("dados.xml"))); encoder.writeObject(objeto); encoder.close(); JavaBeans - Persistência • XMLDecoder: XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("dados.xml"))); MinhaClasse obj = (MinhaClasse)decoder.readObject(); decoder.close(); Recursos • XML Portal W3C – http://www.w3.org/standards/xml/ • XML Padrão 1.0 – http://www.w3.org/TR/2008/REC-xml-20081126/ • XML Padrão 1.1 – http://www.w3.org/TR/2006/REC-xml1120060816 Recursos • XML Schema Definition – http://www.w3.org/TR/2004/REC-xmlschema-020041028/ – http://www.w3.org/TR/2004/REC-xmlschema-120041028/ – http://www.w3.org/TR/2004/REC-xmlschema-220041028/ • Document Type Definition – http://www.w3.org/TR/2008/REC-xml20081126/#dt-doctype Recursos • Java API for XML Processing – http://download.oracle.com/javase/tutorial/jaxp/i ndex.html • The Java Tutorial – http://download.oracle.com/javase/tutorial/index .html • Java SE 6 API – http://download.oracle.com/javase/6/docs/api Recursos • Ferramentas – http://www.ibm.com/developerworks/library/xxmltools/index.html