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.
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
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();
}
}
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.
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)
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
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.