com.articulate.sigma.BasicXMLparser Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sigma-component Show documentation
Show all versions of sigma-component Show documentation
Sigma knowledge engineering system is an system for developing, viewing and debugging theories in first
order logic. It works with Knowledge Interchange Format (KIF) and is optimized for the Suggested Upper Merged
Ontology (SUMO) www.ontologyportal.org.
/** This code is copyright Articulate Software (c) 2003. Some portions
copyright Teknowledge (c) 2003 and reused under the terms of the GNU license.
This software is released under the GNU Public License .
Users of this code also consent, by use of this code, to credit Articulate Software
and Teknowledge in any writings, briefings, publications, presentations, or
other representations of any software which incorporates, builds on, or uses this
code. Please cite the following article in any publication with references:
Pease, A., (2003). The Sigma Ontology Development Environment,
in Working Notes of the IJCAI-2003 Workshop on Ontology and Distributed Systems,
August 9, Acapulco, Mexico.
*/
package com.articulate.sigma;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.StringReader;
import java.text.ParseException;
import java.util.ArrayList;
/** ***************************************************************
* Parses simple XML into a hierarchy of BasicXMLelement (s). Used
* instead of SAX because that class is so complex. The right thing
* to do is probably to subclass SAX or create some simpler utility
* class that makes using it easier.
* This class assumes that each XML tag is on its own line and that
* every attribute value is enclosed in single or double quotes.
*/
public class BasicXMLparser {
/** An ArrayList of BasicXMLelement(s). */
public ArrayList elements = new ArrayList();
/** ***************************************************************
* Constructor that parses an XML-formatted string, with one tag per
* line, into an ArrayList of BasicXMLelement (s).
*/
public BasicXMLparser(String xml) {
StringReader sr = new StringReader(xml);
LineNumberReader lnr = new LineNumberReader(sr);
try {
BasicXMLelement el = new BasicXMLelement();
parse(lnr,el);
elements = el.subelements;
}
catch (ParseException pe) {
System.out.print("Error in BasicXMLparser(): " + pe.getMessage() + " At line:");
System.out.println(pe.getErrorOffset());
elements = null;
}
catch (IOException ioe) {
System.out.println("Error in BasicXMLparser(): " + ioe.getMessage());
elements = null;
}
}
/** ***************************************************************
* Parse an XML formatted string into a hierarchy of BasicXMLelement (s).
* Assume that each line has only one tag.
*/
private void parse(LineNumberReader lnr, BasicXMLelement element) throws ParseException, IOException {
String newTag = null;
boolean inQuote = false;
while (lnr.ready()) {
String line = lnr.readLine();
inQuote = false;
if (line == null) {
System.out.println("INFO in BasicXMLparser.parse: Exiting with line = null.");
return;
}
line = line.trim();
int tagStart = line.indexOf('<');
if (tagStart != 0) { // It's not a tag
element.contents = element.contents + (new String(line.trim()));
System.out.println("INFO in BasicXMLparser.parse: Adding contents: " + line);
continue;
}
if (line.charAt(tagStart+1) == '/') { // Found a closing tag
String endTagString = line.substring(tagStart+2,line.indexOf('>'));
if (element.tagname == null)
throw new ParseException("Error in BasicXMLparser.parse(): Closing tag " + line + " without open tag, at line: ", lnr.getLineNumber());
if (endTagString.equalsIgnoreCase(element.tagname))
return;
else
throw new ParseException("Error in BasicXMLparser.parse(): Close tag " + endTagString + " doesn't match open tag " + element.tagname, lnr.getLineNumber());
}
else { // An opening or combined open/close tag - like
int tagEnd = tagStart + 1;
while (tagEnd < line.length() && Character.isJavaIdentifierPart(line.charAt(tagEnd)))
tagEnd++;
newTag = line.substring(line.indexOf('<') + 1,tagEnd);
BasicXMLelement newElement = new BasicXMLelement();
newElement.tagname = newTag;
if (line.charAt(tagEnd) == ' ') { // The tag has attributes
do {
tagEnd++;
int name = tagEnd;
while (tagEnd < line.length() && Character.isJavaIdentifierPart(line.charAt(tagEnd)))
tagEnd++;
String nameString = line.substring(name,tagEnd);
if (line.charAt(tagEnd) != '=')
throw new ParseException("Error in BasicXMLparser.parse(): Name without value: " + nameString, lnr.getLineNumber());
tagEnd++;
int value = tagEnd;
char valueEnd = ' ';
if (line.charAt(value) == '\'') {
value++;
tagEnd++;
valueEnd = '\'';
inQuote = !inQuote;
}
if (line.charAt(value) == '\"') {
value++;
tagEnd++;
valueEnd = '\"';
inQuote = !inQuote;
}
while (tagEnd < line.length() && line.charAt(tagEnd) != valueEnd &&
(line.charAt(tagEnd) != '>' || inQuote)) {
tagEnd++;
if (line.charAt(tagEnd) == '\"' || line.charAt(tagEnd) == '\'')
inQuote = !inQuote;
}
String valueString = line.substring(value,tagEnd);
if (line.charAt(tagEnd) == valueEnd)
tagEnd++;
newElement.attributes.put(nameString,valueString);
} while (line.charAt(tagEnd) == ' ');
}
if (line.charAt(tagEnd) == '>') {
parse(lnr,newElement);
element.subelements.add(newElement);
}
else if (line.charAt(tagEnd) == '/' &&
(line.charAt(tagEnd + 1) == '>' && !inQuote)) {
newTag = "";
element.subelements.add(newElement);
}
}
}
return;
}
/** ***************************************************************
* Convert the XML hierarchy to a String.
*/
public String toString() {
StringBuffer result = new StringBuffer();
for (int i = 0; i < elements.size(); i++) {
BasicXMLelement element = elements.get(i);
result = result.append(element.toString());
}
return result.toString();
}
/** ***************************************************************
* Test method.
*/
public static void main(String[] args) {
//String xml = "\n\n\n\n\n \n \n\n\n\n \n\n\n(<=> (holds subclass ?X108 ?X14) (and (holds instance ?X108 SetOrClass) (holds instance ?X14 SetOrClass) (forall ( ?X15) (=> (holds instance ?X15 ?X108) (holds instance ?X15 ?X14)))))\n \n \n \n \n \n \n";
// String xml = "\n\n \n \n";
String xml = " \n" +
" \n" +
" \n"+
" \n \n"+
" \n"+
" \n"+
" \n"+
" \n"+
" \n"+
" \n"+
" \n"+
"\n"+
" \n"+
" \n"+
" \n"+
" \n";
BasicXMLparser bp = new BasicXMLparser(xml);
System.out.print("Parse completed. Number of elements: ");
System.out.println(bp.elements.size());
System.out.println(bp.toString());
/*
(holds instance AbsoluteValueFn TotalValuedRelation)
*/
}
}