Xml: recuperar elementos e subelementos

Pessoal, Boa Tarde!

A minha aplicação lê um xsd, “põe” esse xsd numa unica string e guarda essa string na tabela.

Em determinado momento a aplicação lê essa tabela e apresenta essa string.

Preciso o seguinte: sabendo determinado elemento ( exemplo: “AcctRef” ) , preciso recuperar elementos e subelementos do <xs:complexType name=“AcctRef”>

Estou pesquisando na internet, mais se alguém puder me ajudar agradeço bastante.

Iza

[quote=izaura]Pessoal, Boa Tarde!

A minha aplicação lê um xsd, “põe” esse xsd numa unica string e guarda essa string na tabela.

Em determinado momento a aplicação lê essa tabela e apresenta essa string.

Preciso o seguinte: sabendo determinado elemento ( exemplo: “AcctRef” ) , preciso recuperar elementos e subelementos do <xs:complexType name=“AcctRef”>

Estou pesquisando na internet, mais se alguém puder me ajudar agradeço bastante.

Iza[/quote]

To ficando preocupada - rsrsrs, no fórum de java avançado e ninguem me ajuda, é a primeira vez q acontece … rs

Se alguém puder ajudar.

Essa foi boa!!! Acho que realmente você vai ter de começar a ficar preocupada!!!

Vou tentar algo, já te digo se conseguir.

vc tem um XSD como uma String e quer recuperar algo nele ?

bom vc pode converter isso para um arquivo e ler o xsd

http://bytes.com/topic/java/answers/827389-reading-xsd-java

[quote=JoaoBluSCBR]Essa foi boa!!! Acho que realmente você vai ter de começar a ficar preocupada!!!

Vou tentar algo, já te digo se conseguir. [/quote]

Valew, Obrigada.

[quote=pugnator]vc tem um XSD como uma String e quer recuperar algo nele ?

bom vc pode converter isso para um arquivo e ler o xsd

http://bytes.com/topic/java/answers/827389-reading-xsd-java[/quote]

Irei olhar esses links. Obrigada!

Minha sugestão é a seguinte:

Usar SAX criando um novo documento a partir da tua string xsd.

e daí no handler a cada abertura de elemento, verificar qual aquele que você quer e
a partir daí colecionar as tags que forem aparecendo depois.

Pense a respeito:


import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource.*;

public class TesteSAX {
    
    //Experimentei usando um arquivo xsd mesmo. 
    //Mas creio que pegar uma string e usar um FileWriter resolve o problema.
    private String arquivo = "C:\\PedidoEnvioRPS_v01.xsd";
    
    public TesteSAX() {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try {
            SAXParser parser = spf.newSAXParser();
            // abre a conexao com o arquivo, buffer de 1 mega   
            org.xml.sax.InputSource input = new org.xml.sax.InputSource(arquivo);
            parser.parse(input, new XMLHandler());
        } catch (javax.xml.parsers.ParserConfigurationException ex) {
            ex.printStackTrace();
        } catch (org.xml.sax.SAXException ex) {
            ex.printStackTrace();
        } catch (java.io.IOException ex){
            ex.printStackTrace();
        }
        
    }

    class XMLHandler extends org.xml.sax.helpers.DefaultHandler {

        /** o galho atual */
        private StringBuffer galhoAtual = new StringBuffer(200);
        /** o valor da tag atual */
        private StringBuffer valorAtual = new StringBuffer(100);
        
        /** comeca um documento novo */
        public void startDocument() {
            System.out.print("iniciando");
        }

        /** termina o documento */
        public void endDocument() {
            System.out.print("\nterminando");
        }
        
        /** comeca uma tag nova */
        public void startElement(
                String uri,
                String localName,
                String tag,
                Attributes atributos){
            
            //Nesse ponto você pode comparar a String tag com 
            //a que você quer e a partir disso, é ir colecionando
            //os elementos

            // seta o galho atual   
            galhoAtual.append("/" + tag);

            // mostra a tag   
            System.out.print(
                    "\n<"
                    + galhoAtual.substring(1)
                    + (atributos.getLength() != 0 ? " +ATRIBUTOS" : "")
                    + ">");

            // limpa a tag atual   
            valorAtual.delete(0, valorAtual.length());
        }
        
        /** termina uma tag */
        public void endElement(String uri, String localName, String tag){

            //E nesse evento você controla o fim do teu elemento procurado para parar de colecionar as tags. 

            // mostra o valor   
            System.out.print(valorAtual.toString().trim());
            // e limpa   
            valorAtual.delete(0, valorAtual.length());

            // seta o galho atual   
            galhoAtual.delete(
                    galhoAtual.length() - tag.length() - 1,
                    galhoAtual.length());

        }
        
        /** recebe os dados de uma tag */
        public void characters(char[] ch, int start, int length) {

            // adiciona ao valor atual   
            valorAtual.append(ch, start, length);

        }


    }

    public static void main(String[] args){
        TesteSAX ts = new TesteSAX();
    }
    
}

Se não entender algo, me avise.

[quote=JoaoBluSCBR]Minha sugestão é a seguinte:

Usar SAX criando um novo documento a partir da tua string xsd.

e daí no handler a cada abertura de elemento, verificar qual aquele que você quer e
a partir daí colecionar as tags que forem aparecendo depois.

Pense a respeito:


import javax.xml.parsers.*;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource.*;

public class TesteSAX {
    
    //Experimentei usando um arquivo xsd mesmo. 
    //Mas creio que pegar uma string e usar um FileWriter resolve o problema.
    private String arquivo = "C:\\PedidoEnvioRPS_v01.xsd";
    
    public TesteSAX() {
        SAXParserFactory spf = SAXParserFactory.newInstance();
        try {
            SAXParser parser = spf.newSAXParser();
            // abre a conexao com o arquivo, buffer de 1 mega   
            org.xml.sax.InputSource input = new org.xml.sax.InputSource(arquivo);
            parser.parse(input, new XMLHandler());
        } catch (javax.xml.parsers.ParserConfigurationException ex) {
            ex.printStackTrace();
        } catch (org.xml.sax.SAXException ex) {
            ex.printStackTrace();
        } catch (java.io.IOException ex){
            ex.printStackTrace();
        }
        
    }

    class XMLHandler extends org.xml.sax.helpers.DefaultHandler {

        /** o galho atual */
        private StringBuffer galhoAtual = new StringBuffer(200);
        /** o valor da tag atual */
        private StringBuffer valorAtual = new StringBuffer(100);
        
        /** comeca um documento novo */
        public void startDocument() {
            System.out.print("iniciando");
        }

        /** termina o documento */
        public void endDocument() {
            System.out.print("\nterminando");
        }
        
        /** comeca uma tag nova */
        public void startElement(
                String uri,
                String localName,
                String tag,
                Attributes atributos){
            
            //Nesse ponto você pode comparar a String tag com 
            //a que você quer e a partir disso, é ir colecionando
            //os elementos

            // seta o galho atual   
            galhoAtual.append("/" + tag);

            // mostra a tag   
            System.out.print(
                    "\n<"
                    + galhoAtual.substring(1)
                    + (atributos.getLength() != 0 ? " +ATRIBUTOS" : "")
                    + ">");

            // limpa a tag atual   
            valorAtual.delete(0, valorAtual.length());
        }
        
        /** termina uma tag */
        public void endElement(String uri, String localName, String tag){

            //E nesse evento você controla o fim do teu elemento procurado para parar de colecionar as tags. 

            // mostra o valor   
            System.out.print(valorAtual.toString().trim());
            // e limpa   
            valorAtual.delete(0, valorAtual.length());

            // seta o galho atual   
            galhoAtual.delete(
                    galhoAtual.length() - tag.length() - 1,
                    galhoAtual.length());

        }
        
        /** recebe os dados de uma tag */
        public void characters(char[] ch, int start, int length) {

            // adiciona ao valor atual   
            valorAtual.append(ch, start, length);

        }


    }

    public static void main(String[] args){
        TesteSAX ts = new TesteSAX();
    }
    
}

Se não entender algo, me avise.[/quote]

Obrigada João. Irei testar e retorno se deu certo ou não.

Joao,

Na linha 50 esta declarado: Attributes atributos

Qual o import desse “Attributes”?

Eu coloquei o import: import com.sun.org.apache.xalan.internal.xsltc.runtime.Attributes; – esta correto?

Acontece o seguinte erro:

iniciandoException in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -11 at java.lang.AbstractStringBuilder.delete(AbstractStringBuilder.java:698) at java.lang.StringBuffer.delete(StringBuffer.java:373) at com.balaska.sie.management.incomingconnectorserviceconsumer.test.teste$XMLHandler.endElement(teste.java:109) at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at org.apache.xerces.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source) at com.balaska.sie.management.incomingconnectorserviceconsumer.test.teste.<init>(teste.java:45) at com.balaska.sie.management.incomingconnectorserviceconsumer.test.teste.main(teste.java:34)

Favor se puder dá uma olhadinha.

Grata,

Izaura

Bem, o meu código já foi com os imports corretos.

Esse que você está questionando é o


import javax.xml.parsers.*;   
import org.xml.sax.Attributes;   
import org.xml.sax.InputSource.*; 

Que ide vc está usando?

Eu usei NetBeans e apenas cliquei no identiicador e pedi para corrigir importações.

Ele ofereceu varias e escolhi essa por que é o que estou usando SAX.

[quote=JoaoBluSCBR]Bem, o meu código já foi com os imports corretos.

Esse que você está questionando é o


import javax.xml.parsers.*;   
import org.xml.sax.Attributes;   
import org.xml.sax.InputSource.*; 

Que ide vc está usando?

Eu usei NetBeans e apenas cliquei no identiicador e pedi para corrigir importações.

Ele ofereceu varias e escolhi essa por que é o que estou usando SAX.

[/quote]

Olá João!

Estou usando o Eclipse.

Mais o que esta “pegando” mesmo é o erro gerado: iniciandoException in thread “main” java.lang.StringIndexOutOfBoundsException: String index out of range: -11

Izaura

Izaura,

Você pode mandar para mim a classe que você está testando?

Por que não tem como eu te ajudar só na imaginação do que você está passando para ela.

O exemplo que te dei, é de um código que abre um arquivo, se voce adaptou para ler uma string gigante,
o que esse erro tá dizendo é que em algum momento você está pedindo, por exemplo, para ler o
caractere 5000 e a tua string só vai até 4999. Então pode ser num loop ou algo mais.

Se você quer realmente ajuda para achar esse erro, me passa o código que está testando e posso
tentar te ajudar.

Erro de outofbounds só dá para pegar debugando. Não há nada no meu código que indique isso pois
é apenas um código que abre um ARQUIVO xml e a cada elemento dispara um evento.

Em nenhum momento ele pode, nessa abertura gerar falha de limites.