Como fazer macrosubstituição em java?

:slight_smile:
Olá Pessoal,

Como se faz macrosubstituição em java ?? eu fazia isso em clipper me desculpe o exemplo antigo, rsrsr

exemplo para criar uma variavel com conteudo de outra:

a = “fulano”

&a = “clovis”

*observação: o que acabei de fazer na segunda linda foi criar uma variavel com nome fulano=“clovis”

como faz isso em java ?, mas vamos ao problema:

estou fazendo um programa para ler qualquer arquivo xml, ou seja sem saber os nomes e as quantidades de tags nesse arquivo,
e pretendo gerar um novo arquivo do tipo rdf, sendo que as classes no arquivo rdf, sera criado de acordo com os nomes das tags do arquivo xml,
estou usando o jena, mas não consigo cliar uma variavel cuja o seu nome seja o coneudo de uma variavel e o nome da tag. tentei map, mas não rolou :frowning:
vejam um trecho do código:

File Arqfile = null;
//**
if (resultado == JFileChooser.APPROVE_OPTION) {
Arqfile = dialogo.getSelectedFile();
//**
if (Arqfile.getName().endsWith(".xml")) {
OntModel model = ModelFactory.createOntologyModel(OntModelSpec.OWL_DL_MEM);
String uriBase = “http://www.something.com/opend”;
model.createOntology(uriBase);
//classes
ArrayList classes = new ArrayList();
Map<String, String> valores = new HashMap<String, String>();
//**
OntClass xmlp = model.createClass(uriBase+"#"+Arqfile.getName());
//implementar parse

try {  
        String xmlFilename = Arqfile.getAbsolutePath();   
        DOMParser parser = new DOMParser();  
        parser.parse(xmlFilename);  
        Document doc = parser.getDocument();
        doc.getDocumentElement().normalize();
        int qtd=0;
        NodeList nodes = doc.getElementsByTagName("*");
        //**
        for (int i =0; i < nodes.getLength(); i++) {
      	//criar um array dinamico com os nomes das classes do xml, se ela já foi criada,
       	// não cria novamente só alimenta o dataproperty
           	    int x=0;
	   for(int y=0; y < classes.size(); y++) {
	       if (classes.get(y).equals(nodes.item(i).getLocalName())) x=1;
	   }
	   if (x==0) {
                   classes.add(nodes.item(i).getLocalName()); // alimenta arraylist 		   				                	
	        valores.put("classe"+i,nodes.item(i).getLocalName()); 
                    qtd=qtd+1;
	   	//OntClass "a"+qtd = model.createClass(uriBase+"#"+Arqfile.getName());

QUERIA FAZER ISSO —> :frowning: OntClass nodes.item(i).getLocalName() = model.createClass(uriBase+"#"+nodes.item(i).getLocalName());

o nome da classe seria o nome da tag que esta em getLocaName()
tem como fazer isso de alguma forma ??? :cry:

	   				        //        	OntClass xmlp = model.createClass(uriBase+"#"+Arqfile.getName());		   				                	
	   				        //        	xmlp.addSubClass()
//	   				                	valores.put("var"+i,nodes.item(i).getLocalName());

// OntClass valores.get(“var”+i) = model.createClass(uriBase+"#"+nodes.item(i).getLocalName());

	   				            //    }
				            		System.out.println(nodes.item(i).getLocalName()); ///***
				                    
				            		
				            		//**

Até onde me lembro, não é possível fazer isto em java.
Talvez reflection te dê alguma luz, mas não sei se será útil.

  1. Esse tipo de coisa, do jeitinho exato que você quer, “non exziste” em Java. (Não é porque o Java é mais novo que o Clipper que tem de suportar tudo que o Clipper tinha :slight_smile: )

  2. Você pode simular alguns casos de uso disso em Java usando-se um Map<String, String>. Um exemplo:

Map<String, String> nome2valor = new HashMap<String, String>();
nome2valor.put ("fulano", "clovis");
...
System.out.println (nome2valor.get ("fulano")); // imprime "clovis"

No seu caso: você pode ter um Map<String, Class<?>> onde Class<?> é o objeto java.lang.Class relativo à classe que você quer invocar dinamicamente.

:slight_smile:

Obrigado pela força de vocês !

mas

Seria asssim:

Map<String, Class<?>> valores = new HashMap>();

for (int i=0, …

valores.put(“classe”+i,nodes.item(i).getLocalName());

OntClass valores.get(“classe”+i) = model.createClass(uriBase+"#"+nodes.item(i).getLocalName());

esta dadndo erro nas 2 ultimas linhas :frowning: o q falta ? sou fraco em java ainda…
[]'s

Bom, falta um monte de coisas. A principal é que você precisa saber o nome completo da classe para poder obter um objeto java.lang.Class<?> com o método Class.forName.

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#forName(java.lang.String)

Uma vez obtendo o objeto Class<?> será necessário, para poder chamar os métodos adequados, você usar reflection. Você vai ter de comer bastante farinha ainda antes de conseguir fazer isso de maneira simples.

Procure por “Java Reflection” no Google.

estou tentando:

valores.put(“classe”+String.valueOf(i), nodes.item(i).getLocalName());

dar a seguinte mensagem :

the method put (String, Class<?>) … is not aplicable for the arguments(String, String)

:frowning:

[]'s

Gosto da linguagem java!

vou comer bastante farinha sim, mas isso poderia ser mais trivial, rsrsr

se alguem puder da mais uma ajuda eu agradeço, rsrs

valeu pessoal

[]'s

enfim, isso que pretendo fazer é possivel pessoal ??

flw

[quote=clovishn]enfim, isso que pretendo fazer é possível pessoal ??

flw[/quote]

Sim, mas não do jeito que está pensando. Vc precisa de usar uma coisa que clipper não tinha : objetos.

O xml tem uma estrutrua. Vc pode simular essa estrutrua com objetos seus. Depois mapear cada pripriedade do xml para a sua estrutrua.

Depois de tudo preenchido vc tem uma imagem do xml nas suas estruturas, depois é só usar.

Ai vc diz “mas eu não sei os nomes das tags”, mas vc sabe que as tags têm nome. Ai vc cria uma classe Tag com a propriedade name. Vai conseguir ler qualquer tag. O mesmo para atributo.
Existem API prontas que já fazem isto e conseguem ler qualquer XML (não sei qual é a mais moderna ai, ha muito tempo que não mexo com isso, e hoje tudo é biding… outrora tinhamos o Dom4j por exemplo)
Mas dá para fazer na mão também. É que vc tem que focar nos metadados e não nos dados em si.

Caro Dr. Sergio Borda,

Me desculpe se irei me equivocar nas palavras baixo:

mas eu já tenho parse no arquivo xml completo:

System.out.println(nodes.item(i).getLocalName()); // essa linha mostra o nome da tag : exemplo MATRICULA

System.out.println(actualNode.getNodeValue()); // essa linha mostra o conteudo da tag exemplo 2013001

porq devo simular essa estrutura com objetos ? e mapear depois ?

o sr. poderia ser um pouco mais especifico ?

[]´s