⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cgxmlparser.java

📁 toocom源代码,主要应用在本体匹配方面!
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
package toocom.iotools;

import java.io.*;
import java.util.*;
import toocom.ocgl.*;

/**
 * This class offers methods for parsing and saving CGXML files.
 *
 * @author Fr閐閞ic F黵st
 */ 
public abstract class CGXMLParser{
	
	private static final String XML_VERSION = "<?xml version=\"1.0\"?>";
	private static final String CoGXML_DTD = "<!DOCTYPE cogxml PUBLIC \"-//COGITANT//CoGXML Format Specification 1.1//EN\" \"http://cogitant.sourceforge.net/cogxml.dtd\">";
	
	private static final String CGXML_UNIVERSAL_CONCEPT_TYPE_ID = "TOP";
	private static final String CGXML_DIFFERENCE_RELATION_TYPE_ID = "DIF";
	
	/** Returns the value of the variable if an egality variable="value" exists in the line.
	 *  Returns null if any value of the given variable exists or if an error occurs. */
	public static String getValueFromXMLLine(String line,String variable){
		if((line != null) && (variable != null)){
			int mark = 0;
			while(mark < line.length()){
				int i = line.indexOf(variable,mark);
				if((i != -1) && (line.charAt(i - 1) == ' ') && 
				  (line.charAt(i + variable.length()) == '=') && (line.charAt(i + variable.length() + 1) == '\"')){
				  	int j = line.indexOf("\"",i + variable.length() + 2);
				  	if(j != -1)	return line.substring(i + variable.length() + 2,j);
					else return null;
				}
				else{
					if(i == -1) return null;
					else mark = i + 1;
				}
			}
			return null;
		}
		else return null;
	}
	
	/** Returns the graph stored in the specified file or null if the file is not valid according
	 *  to the CGXML DTD or if the graph is not a valid graph for the given ontology. */
	public static Graph loadGraph(Ontology onto,Language l,String graphFileName,boolean trace) throws FileNotFoundException,IOException{
		BufferedReader buf = new BufferedReader(new FileReader(graphFileName));
		Hashtable cTable = new Hashtable();
		Hashtable rTable = new Hashtable();
		try{
			if(trace) System.out.println("Loading graph stored in file " + graphFileName);
			String xml_version = buf.readLine();
			String cogxml_dtd = buf.readLine();
			String cogxml_markup = buf.readLine();
			String version = CGXMLParser.getValueFromXMLLine(cogxml_markup,"app");
			String graphName = CGXMLParser.getValueFromXMLLine(buf.readLine(),"id");
			Graph g;
			if((graphName == null) || (graphName.equals("?"))){
				g = new Graph(new Terms(graphFileName.substring(graphFileName.lastIndexOf("\\") + 1,graphFileName.indexOf("."))));
			}
			else g = new Graph(new Terms(graphName));
			for(String s = buf.readLine();(s != null) && (s.indexOf("</graph>") == -1);s = buf.readLine()){			
				if(s.indexOf("<concept") != -1){
					String id = CGXMLParser.getValueFromXMLLine(s,"id");
					String idType = CGXMLParser.getValueFromXMLLine(s,"idType");
					String idMarker = CGXMLParser.getValueFromXMLLine(s,"idMarker");
					String labelMarker = CGXMLParser.getValueFromXMLLine(s,"labelMarker");
					String gx = CGXMLParser.getValueFromXMLLine(s,"gx");
					String gy = CGXMLParser.getValueFromXMLLine(s,"gy");
					Concept c;
					if(idType != null){
						c = new Concept(onto.getConceptType(idType,l));
					}
					else{
						c = new Concept();
					}
					if(idMarker != null){
						c.setIndividual(onto.getIndividual(idMarker,l));
					}
					if(labelMarker != null){
						c.setTerm(labelMarker,l);
					}
					if((gx != null) && (gy != null)){
						int x = Integer.parseInt(gx);
						int y = Integer.parseInt(gy);
						c.setLocation(x,y);
					}
					else c.setRandomLocation();
					g.addConcept(c);
					cTable.put(id,new Integer(c.getId()));
				}
				if(s.indexOf("<relation") != -1){
					String id = CGXMLParser.getValueFromXMLLine(s,"id");
					String idType = CGXMLParser.getValueFromXMLLine(s,"idType");
					String gx = CGXMLParser.getValueFromXMLLine(s,"gx");
					String gy = CGXMLParser.getValueFromXMLLine(s,"gy");
					Relation r;
					if(idType != null){
						r = new Relation(onto.getRelationType(idType,l));
					}
					else{
						r = new Relation();
					}
					if((gx != null) && (gy != null)){
						int x = Integer.parseInt(gx);
						int y = Integer.parseInt(gy);
						r.setLocation(x,y);
					}
					else r.setRandomLocation();
					g.addRelation(r);
					rTable.put(id,new Integer(r.getId()));
				}
				if(s.indexOf("<edge") != -1){
					String label = CGXMLParser.getValueFromXMLLine(s,"label");
					String rid = CGXMLParser.getValueFromXMLLine(s,"rid");
					String cid = CGXMLParser.getValueFromXMLLine(s,"cid");
					Relation r = g.getRelation(((Integer) rTable.get(rid)).intValue());
					Concept c = g.getConcept(((Integer) cTable.get(cid)).intValue());
					r.setLinkedConcept(c,Integer.parseInt(label));
				}
			}
			buf.close();				
			return g;
		}
		catch(Exception e){
			buf.close();
			return null;
		}
	}
	
	/** Returns the graph stored in the specified file or null if the file is not valid according
	 *  to the CGXML DTD or if the graph is not a valid graph for the given ontology. */
	public static boolean saveGraph(Ontology onto,Graph g,Language l,String graphFileName,boolean trace) throws IOException{
		Hashtable cTable = new Hashtable();
		Hashtable rTable = new Hashtable();
		if(trace) System.out.println("Saving graph " + g.getTerm(l) + " in file " + graphFileName);
		FileWriter file = new FileWriter(graphFileName);
		try{
			file.write(CGXMLParser.XML_VERSION + "\n");
			file.write(CGXMLParser.CoGXML_DTD + "\n");
			file.write("<cogxml app=\"TooCoM " + CGConstants.TOOCOM_VERSION + "\" ontology=\"" + onto.getTerm(l) + "\">\n");
			file.write("	<graph id=\"" + g.getTerm(l) + "\">\n");
			int cpt = 0;
			for(Iterator j = g.getConcepts().iterator();j.hasNext();cpt ++){
				Concept c = (Concept) j.next();
				file.write("		<concept id=\"c" + cpt + "\" ");
				if(c.getType() != null) file.write("idType=\"" + c.getType().getTerm(l) + "\" ");
				Individual ind = c.getIndividual();
				if(ind != null) file.write("idMarker=\"" + ind.getTerm(l) + "\" ");
				else{
					if(!c.getTerm(l).equals("")) file.write("labelMarker=\"" + c.getTerm(l) + "\" ");
				}
				file.write("gx=\"" + c.x + "\" gy=\"" + c.y + "\"/>\n");
				cTable.put(new Integer(c.getId()),"c" + cpt);
			}	
			cpt = 0;
			for(Iterator j = g.getRelations().iterator();j.hasNext();cpt ++){
				Relation r = (Relation) j.next();
				file.write("		<relation id=\"r" + cpt + "\" ");
				if(r.getType() != null) file.write("idType=\"" + r.getType().getTerm(l) + "\" ");
				file.write("gx=\"" + r.x + "\" gy=\"" + r.y + "\"/>\n");
				rTable.put(new Integer(r.getId()),"r" + cpt);
			}
			for(Iterator j = g.getRelations().iterator();j.hasNext();cpt ++){
				Relation r = (Relation) j.next();
				for(int k = 1;k <= r.getArity();k ++){
					Concept c = r.getLinkedConcept(k);
					if(c != null){
						file.write("		<edge label=\"" + k + "\" rid=\"" + rTable.get(new Integer(r.getId())) + "\" cid=\"" + cTable.get(new Integer(c.getId())) + "\"/>\n");
					}
				}
			}
			file.write("	</graph>\n");
			file.write("</cogxml>");
			file.close();
			return true;
		}
		catch(Exception e){
			file.close();
			return false;
		}
	}
	
	
	/** Returns the ontology that is stored in the files ontologyName.cgxml in
	 *  the given language, null if the file is not valid according to the CGXML DTD. */
	public static Ontology loadOntology(String ontologyFileName,Language l,boolean trace) throws FileNotFoundException,IOException{
		// Tables file_id(String)/TooCoM_id(Integer)
		Hashtable ctTable = new Hashtable();
		Hashtable rtTable = new Hashtable();
		Hashtable indTable = new Hashtable();
		// 0=beginning, 1=concept types passed, 2=relation types passed, 3=axioms passed
		int control = 0;
		if(trace) System.out.println("Loading ontology file " + ontologyFileName);
		BufferedReader buf = new BufferedReader(new FileReader(ontologyFileName));
		try{
			String xml_version = buf.readLine();
			String cogxml_dtd = buf.readLine();
			String cogxml_markup = buf.readLine();
			String version = CGXMLParser.getValueFromXMLLine(cogxml_markup,"app");
			Ontology onto = new Ontology(new Terms(CGXMLParser.getValueFromXMLLine(cogxml_markup,"ontology"),l),false);
			if(trace) System.out.println("Ontology name " + onto.getTerm(l));
			for(String s = buf.readLine();(s != null) && (s.indexOf("<conceptTypes>") == -1);s = buf.readLine()){}
			// Concept Types
			for(String s = buf.readLine();(s != null) && (s.indexOf("</conceptTypes>") == -1);s = buf.readLine()){		
				if(s.indexOf("<ctype") != -1){
					String id = CGXMLParser.getValueFromXMLLine(s,"id");
					String label = CGXMLParser.getValueFromXMLLine(s,"label");
					String gx = CGXMLParser.getValueFromXMLLine(s,"gx");
					String gy = CGXMLParser.getValueFromXMLLine(s,"gy");
					ConceptType ct = onto.newConceptType(new Terms(label,l));
					if(trace) System.out.println("Concept type " + label);
					if(id.equals(CGXMLParser.CGXML_UNIVERSAL_CONCEPT_TYPE_ID)) onto.setUniversalConceptType(ct);
					ctTable.put(id,new Integer(ct.getId()));
					if((gx != null) && (gy != null)){
						int x = Integer.parseInt(gx);
						int y = Integer.parseInt(gy);
						ct.setLocation(x,y);
					}
					else ct.setRandomLocation();
					control = 1;
				}
				if(s.indexOf("<order") != -1){
					String id1 = CGXMLParser.getValueFromXMLLine(s,"id1");
					String id2 = CGXMLParser.getValueFromXMLLine(s,"id2");
					ConceptType ct1 = onto.getConceptType(((Integer) ctTable.get(id1)).intValue());
					ConceptType ct2 = onto.getConceptType(((Integer) ctTable.get(id2)).intValue());
					ct1.addParent(ct2);
					ct2.addChild(ct1);
				}
			
			}
			for(String s = buf.readLine();(s != null) && (s.indexOf("<relationTypes>") == -1);s = buf.readLine()){}
			// Relation types
			for(String s = buf.readLine();(s != null) && (s.indexOf("</relationTypes>") == -1);s = buf.readLine()){		
				if(s.indexOf("<rtype") != -1){
					String id = CGXMLParser.getValueFromXMLLine(s,"id");
					String label = CGXMLParser.getValueFromXMLLine(s,"label");
					String signature = CGXMLParser.getValueFromXMLLine(s,"idSignature");
					String gx = CGXMLParser.getValueFromXMLLine(s,"gx");
					String gy = CGXMLParser.getValueFromXMLLine(s,"gy");
					RelationType rt = onto.newRelationType(new Terms(label,l));
					if(trace) System.out.println("Relation type " + label);
					if(id.equals(CGXMLParser.CGXML_DIFFERENCE_RELATION_TYPE_ID)) onto.setDifferenceRelationType(rt);
					rtTable.put(id,new Integer(rt.getId()));
					if((gx != null) && (gy != null)){
						int x = Integer.parseInt(gx);
						int y = Integer.parseInt(gy);
						rt.setLocation(x,y);
					}
					else rt.setRandomLocation();
					LinkedList sign = new LinkedList();
					while(signature != null){
						int k = signature.indexOf(" ");
						int ctId;
						if(k != -1){
							ctId = ((Integer) ctTable.get(signature.substring(0,signature.indexOf(" ")))).intValue();
							signature = signature.substring(signature.indexOf(" ") + 1);
						}
						else{
							ctId = ((Integer) ctTable.get(signature)).intValue();
							signature = null;
						}
						sign.add((ConceptType) onto.getConceptType(ctId));
					}
					rt.setSignature(new Signature(sign));
					control = 2;
				}
				if(s.indexOf("<order") != -1){
					String id1 = CGXMLParser.getValueFromXMLLine(s,"id1");
					String id2 = CGXMLParser.getValueFromXMLLine(s,"id2");
					RelationType rt1 = onto.getRelationType(((Integer) rtTable.get(id1)).intValue());
					RelationType rt2 = onto.getRelationType(((Integer) rtTable.get(id2)).intValue());
					rt1.addParent(rt2);
					rt2.addChild(rt1);
				}
			}
			for(String s = buf.readLine();(s != null) && (s.indexOf("<conformity>") == -1);s = buf.readLine()){}
			// Individuals
			for(String s = buf.readLine();(s != null) && (s.indexOf("</conformity>") == -1);s = buf.readLine()){
				if(s.indexOf("<marker") != -1){
					String id = CGXMLParser.getValueFromXMLLine(s,"id");
					String label = CGXMLParser.getValueFromXMLLine(s,"label");
					String idType = CGXMLParser.getValueFromXMLLine(s,"idType");
					if(idType != null){
						Individual ind = onto.newIndividual(new Terms(label,l),onto.getConceptType(((Integer) ctTable.get(idType)).intValue()));
						indTable.put(id,new Integer(ind.getId()));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -