📄 cgxmlparser.java
字号:
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 + -