syndication/rdf
modelmaker.cpp
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "modelmaker.h"
00024 #include "literal.h"
00025 #include "model.h"
00026 #include "property.h"
00027 #include "rdfvocab.h"
00028 #include "resource.h"
00029 #include "sequence.h"
00030 #include "statement.h"
00031
00032 #include <QtXml/QDomElement>
00033 #include <QtCore/QString>
00034
00035 namespace Syndication {
00036 namespace RDF {
00037
00038
00039 Model ModelMaker::createFromXML(const QDomDocument& doc)
00040 {
00041 Model model;
00042
00043 if (doc.isNull())
00044 return model;
00045
00046 QDomElement rdfNode = doc.documentElement();
00047
00048 QDomNodeList list = rdfNode.childNodes();
00049
00050 for (uint i = 0; i < list.length(); ++i)
00051 {
00052 if (list.item(i).isElement())
00053 {
00054 QDomElement el = list.item(i).toElement();
00055 readResource(model, el);
00056 }
00057 }
00058
00059 return model;
00060 }
00061
00062 ResourcePtr ModelMaker::readResource(Model& model, const QDomElement& el)
00063 {
00064 QString rdfns = RDFVocab::self()->namespaceURI();
00065 QString about = QString::fromUtf8("about");
00066 QString resource = QString::fromUtf8("resource");
00067 QString descriptionStr = QString::fromUtf8("Description");
00068
00069 ResourcePtr res;
00070
00071 ResourcePtr type = model.createResource(el.namespaceURI() + el.localName());
00072
00073 if (*type == *(RDFVocab::self()->seq()))
00074 {
00075 SequencePtr seq = model.createSequence(el.attribute(about));
00076
00077 res = seq;
00078 }
00079 else
00080 {
00081 res = model.createResource(el.attribute(about));
00082 }
00083
00084 model.addStatement(res, RDFVocab::self()->type(), type);
00085
00086 QDomNodeList children = el.childNodes();
00087
00088 bool isSeq = res->isSequence();
00089
00090 for (uint i = 0; i < children.length(); ++i)
00091 {
00092 if (children.item(i).isElement())
00093 {
00094 QDomElement ce = children.item(i).toElement();
00095
00096 PropertyPtr pred = model.createProperty(ce.namespaceURI() + ce.localName());
00097
00098 if (ce.hasAttribute(resource))
00099 {
00100 NodePtr obj = model.createResource(ce.attribute(resource));
00101
00102 if (isSeq && *pred == *(RDFVocab::self()->li()))
00103 {
00104 SequencePtr tseq = boost::static_pointer_cast<Sequence>(res);
00105 tseq->append(obj);
00106 }
00107 else
00108 model.addStatement(res, pred, obj);
00109 }
00110 else if (!ce.text().isEmpty() && ce.lastChildElement().isNull())
00111 {
00112 NodePtr obj = model.createLiteral(ce.text());
00113
00114 if (isSeq && *pred == *(RDFVocab::self()->li()))
00115 {
00116 SequencePtr tseq = boost::static_pointer_cast<Sequence>(res);
00117 tseq->append(obj);
00118 }
00119 else
00120 model.addStatement(res, pred, obj);
00121 }
00122 else
00123 {
00124 QDomElement re = ce.lastChildElement();
00125
00126 QString uri = re.attribute(about);
00127
00128
00129 NodePtr obj = readResource(model, re);
00130
00131 if (isSeq && *pred == *(RDFVocab::self()->li()))
00132 {
00133 SequencePtr tseq = boost::static_pointer_cast<Sequence>(res);
00134 tseq->append(obj);
00135 }
00136 else
00137 model.addStatement(res, pred, obj);
00138
00139 }
00140
00141
00142 }
00143 }
00144
00145 return res;
00146 }
00147
00148 }
00149 }