public static Ontology CreateOntologyFromXml(XmlElement eXmlRoot, Action<string> errorAction)
{
Ontology onti = null;
XmlElement eRootElement = null;
#region <rdf:RDF>
try
{
eRootElement = eXmlRoot.getChildElements("rdf:RDF").First(); // <rdf:RDF
onti = new Ontology();
onti.Xmlns = eRootElement.getAttribute("xmlns", onti.Xmlns).strValue; // xmlns = "http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl#"
onti.XmlBase = eRootElement.getAttribute("xml:base", onti.XmlBase).strValue; // xml:base = "http://www.lehigh.edu/~zhp2/2004/0401/univ-bench.owl"
onti.XmlnsRdf = eRootElement.getAttribute("xmlns:rdf", onti.XmlnsRdf).strValue; // xmlns:rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
onti.XmlnsRdfs = eRootElement.getAttribute("xmlns:rdfs", onti.XmlnsRdfs).strValue; // xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
onti.XmlnsOwl = eRootElement.getAttribute("xmlns:owl", onti.XmlnsOwl).strValue; // xmlns:owl="http://www.w3.org/2002/07/owl#"
}
catch (Exception a) { }
if (eRootElement == null)
{
if (errorAction != null)
errorAction("invalid structure: Missing root:element <rdf:RDF ..>");
return onti;
}
#endregion
#region <owl:ontology>
try
{
XmlElement eOntology = eRootElement.getChildElements("owl:Ontology").First(); // <owl:Ontology
onti.About = eOntology.getAttribute("rdf:about", onti.About).strValue; // rdf:about="">
// not mandatory
try
{ // <rdfs:comment>An university ontology for benchmark tests</rdfs:comment>
onti.Comment = eOntology.getChildElements("rdfs:comment").First().getText(onti.Comment);
}
catch (Exception aa) { }
// not mandatory
try
{ // <rdfs:label>Univ-bench Ontology</rdfs:label>
onti.Label = eOntology.getChildElements("rdfs:label").First().getText(onti.Label);
}
catch (Exception aa) { }
// <owl:versionInfo>univ-bench-ontology-owl, ver April 1, 2004</owl:versionInfo>
onti.VersionInfo = eOntology.getChildElements("owl:versionInfo").First().getText(onti.VersionInfo);
}
catch (Exception a)
{
if (errorAction != null)
errorAction("invalid structure: Missing param in <owl:ontology>." + a.Message + "\r\n" + a.StackTrace);
return onti;
}
#endregion
#region <owl:class>
List<XmlElement> eClasses = eRootElement.getChildElements("owl:Class");
OClass currentClass;
String id;
foreach (XmlElement xmlCurrentClass in eClasses)
{
try
{
currentClass = new OClass();
try
{
currentClass.ID = xmlCurrentClass.getAttribute("rdf:ID", currentClass.ID).strValue; // <owl:Class rdf:ID="AdministrativeStaff">
}
catch (Exception aa) { }
try
{
if (currentClass.ID == null)
{
currentClass.ID = xmlCurrentClass.getAttribute("rdf:about", currentClass.ID /*About*/).strValue; // <owl:Class rdf:about="http://dbpedia.org/ontology/Cycad">
}
}
catch (Exception aa) { }
if (currentClass.ID == null)
{
if (errorAction != null)
errorAction("Error adding <owl:class>: Missing rdf:ID or rdf:about. " + xmlCurrentClass);
continue;
}
try // not mandatory: <rdfs:label>administrative staff worker</rdfs:label>
{
currentClass.Label = xmlCurrentClass.getChildElements("rdfs:label").First().getText(currentClass.Label);
}
catch (Exception aa) { }
try // not mandatory: <rdfs:comment xml:lang="en">a group of sports teams that compete against each other in Cricket</rdfs:comment>
{
XmlElement eClassComment = xmlCurrentClass.getChildElements("rdfs:comment").First();
currentClass.Comment = eClassComment.getText(currentClass.Comment);
currentClass.CommentLang = eClassComment.getAttribute("xml:lang", currentClass.CommentLang).strValue;
}
catch (Exception aa) { }
try // not mandatory : // <rdfs:subClassOf rdf:resource="#Employee" />
{
id = xmlCurrentClass
.getChildElements("rdfs:subClassOf").First()
.getAttribute("rdf:resource", "").strValue;
if (id.StartsWith("#")) // ? todo clarify
id = id.Substring(1);
currentClass.IsSubClassOf = new OClass(id /*, id*/);
}
catch (Exception aa) { }
try
{
XmlElement eIntersection = xmlCurrentClass.getChildElements("owl:intersectionOf").First(); // <owl:intersectionOf rdf:parseType="Collection">
XmlElement eISectClass = eIntersection.getChildElements("owl:Class").First(); // <owl:Class rdf:about="#Person" />
string strIsectAbout = eISectClass.getAttribute("rdf:about", "").strValue;
if (strIsectAbout.StartsWith("#"))
strIsectAbout = strIsectAbout.Substring(1); // todo clarify
currentClass.IsSubClassOf = new OClass(/*null,*/ strIsectAbout);
OProperty odProp = new OProperty();
XmlElement eRestriction = eIntersection.getChildElements("owl:Restriction").First(); // <owl:Restriction>
XmlElement eOnProperty = eRestriction.getChildElements("owl:onProperty").First(); // <owl:onProperty rdf:resource="#headOf" />
odProp.ID = eOnProperty.getAttribute("rdf:resource", "").strValue;
XmlElement eSomeValuesFrom = eRestriction.getChildElements("owl:someValuesFrom").First(); // <owl:someValuesFrom>
XmlElement eValuesClass = eSomeValuesFrom.getChildElements("owl:Class").First(); // <owl:Class rdf:about="#Department" />
odProp.Domain = eValuesClass.getAttribute("rdf:about", "").strValue;
currentClass.AddDatatype(odProp);
}
catch (Exception aa) { }
if (!onti.AddOntologyClass(currentClass))
{
if (errorAction != null)
errorAction("Didn't add <owl:class> " + currentClass + " xml=" + xmlCurrentClass);
continue;
}
// onti.ValidateClasses();
}
catch (Exception a)
{
Console.WriteLine("the following OntologyClass had not been imported due to errors.");
Console.WriteLine(xmlCurrentClass.ToString());
Console.WriteLine(a.Message);
Console.WriteLine(a.StackTrace);
Console.WriteLine();
}
}
#endregion
#region <owl:DatatypeProperty>
List<XmlElement> lDatatypes = eRootElement.getChildElements("owl:DatatypeProperty");
OProperty currentDatatype;
foreach (XmlElement xmlCurrentElement in lDatatypes)
{
try
{
currentDatatype = new OProperty();
try
{
currentDatatype.ID = xmlCurrentElement.getAttribute("rdf:ID", currentDatatype.ID).strValue; // <owl:DatatypeProperty rdf:ID="age">
}
catch (Exception aa) { }
try
{
if (currentDatatype.ID == null)
currentDatatype.ID = xmlCurrentElement.getAttribute("rdf:about", currentDatatype.ID).strValue; // <owl:DatatypeProperty rdf:about="http://dbpedia.org/ontology/dateOfBurial">
}
catch (Exception aa) { }
if (currentDatatype.ID == null)
{
if (errorAction != null)
errorAction("Error adding <owl:DatatypeProperty>: Missing rdf:ID or rdf:about. " + xmlCurrentElement);
continue;
}
try
{
currentDatatype.Domain = xmlCurrentElement
.getChildElements("rdfs:domain").First()
.getAttribute("rdf:resource", currentDatatype.Domain).strValue;
}
catch (Exception a) { }
try // not mandatory: <rdfs:range rdf:resource="http://www.w3.org/2001/XMLSchema#date"></rdfs:range>
{
// if (currentDatatype.Domain == null)
// {
currentDatatype.Range = xmlCurrentElement
.getChildElements("rdfs:range").First()
.getAttribute("rdf:resource", currentDatatype.Domain).strValue;
// }
}
catch (Exception aa) { }
/*
if (currentDatatype.Domain == null)
{
errorAction("Error adding <owl:DatatypeProperty>: Neither Range or Domain is set in xml:" + xmlCurrentElement);
continue;
}*/
try // not mandatory: <rdfs:label>is age</rdfs:label>
{
currentDatatype.Label = xmlCurrentElement.getChildElements("rdfs:label").First().getText(currentDatatype.Label);
}
catch (Exception aa) { }
if (!onti.AddDatatype(currentDatatype))
{
if (errorAction != null)
errorAction("Didn't add <owl:DatatypeProperty> " + currentDatatype);
continue;
}
/*
else
{
Console.WriteLine("added datatype: " + currentDatatype.ToString());
}*/
}
catch (Exception a)
{
Console.WriteLine("the following datatype had not been imported due to errors.");
Console.WriteLine(xmlCurrentElement.ToString());
Console.WriteLine(a.Message);
Console.WriteLine(a.StackTrace);
Console.WriteLine();
}
}
#endregion
#region <owl:ObjectProperty rdf:about="http://dbpedia.org/ontology/similar">
List<XmlElement> lObjectProperties = eRootElement.getChildElements("owl:ObjectProperty");
OProperty currentObjectProperty;
foreach (XmlElement xmlCurrentObjectProperty in lObjectProperties)
{
try
{
currentObjectProperty = new OProperty();
try
{
currentObjectProperty.ID = xmlCurrentObjectProperty.getAttribute("rdf:ID", currentObjectProperty.ID).strValue; // <owl:ObjectProperty rdf:ID="degreeFrom">
}
catch (Exception aa) { }
try
{
if (currentObjectProperty.ID == null)
{
currentObjectProperty.ID = xmlCurrentObjectProperty.getAttribute("rdf:about", currentObjectProperty.ID).strValue; // <owl:ObjectProperty rdf:about="http://dbpedia.org/ontology/similar">
}
}
catch (Exception aa) { }
if (currentObjectProperty.ID == null)
{
if (errorAction != null)
errorAction("Error adding <owl:ObjectProperty>: Missing rdf:ID or rdf:about. " + xmlCurrentObjectProperty);
continue;
}
try
{
currentObjectProperty.Domain = xmlCurrentObjectProperty
.getChildElements("rdfs:domain").First()
.getAttribute("rdf:resource", currentObjectProperty.Domain).strValue;
}
catch (Exception aa)
{
if (errorAction != null)
errorAction("Error adding ObjectProperty: <rdfs:domain> is not set in xml:" + xmlCurrentObjectProperty);
continue;
}
try
{
currentObjectProperty.Range = xmlCurrentObjectProperty
.getChildElements("rdfs:range").First()
.getAttribute("rdf:resource", currentObjectProperty.Range).strValue;
}
catch (Exception aa)
{
if (errorAction != null)
errorAction("Error adding ObjectProperty: <rdfs:range> is not set in xml:" + xmlCurrentObjectProperty);
continue;
}
try // not mandatory: <rdfs:label>is age</rdfs:label>
{
currentObjectProperty.Label = xmlCurrentObjectProperty.getChildElements("rdfs:label").First().getText(currentObjectProperty.Label);
}
catch (Exception aa) { }
try // not mandatory: <owl:inverseOf rdf:resource="#hasAlumnus"/>
{
currentObjectProperty.InverseOf = xmlCurrentObjectProperty.getChildElements("rdfs:label").First().getText(currentObjectProperty.InverseOf);
}
catch (Exception aa) { }
try // not mandatory: <rdfs:subPropertyOf rdf:resource="#memberOf" />
{
currentObjectProperty.SubPropertyOf = xmlCurrentObjectProperty
.getChildElements("rdfs:subPropertyOf").First()
.getAttribute("", currentObjectProperty.SubPropertyOf).strValue;
}
catch (Exception aa) { }
if (!onti.AddObjectProperty(currentObjectProperty))
{
if (errorAction != null)
errorAction("Didn't add <owl:ObjectProperty> " + currentObjectProperty);
}
}
catch (Exception a)
{
Console.WriteLine("the following ObjectProperty had not been imported due to errors.");
Console.WriteLine(xmlCurrentObjectProperty.ToString());
Console.WriteLine(a.Message);
Console.WriteLine(a.StackTrace);
Console.WriteLine();
}
}
#endregion
return onti;
}