Seite 1 von 1

XML DTD einlesen mit DOM ?

Verfasst: 1. März 2010 14:34
von Frederick
Hallo,

ich hab mir gerade ein kleines simples Problem, welches mir ein bisschen den Nerv raubt. Ich habe ein XMLDocument mit einer DTD:

[code]
<!DOCTYPE rdf:RDF [
<!ENTITY www "http://www.SPAM_Ontology.owl#" >
<!ENTITY bfo "http://www.ifomis.org/bfo/1.1#" >
<!ENTITY owl "http://www.w3.org/2002/07/owl#" >
<!ENTITY dc "http://purl.org/dc/elements/1.1/" >
<!ENTITY xsd "http://www.w3.org/2001/XMLSchema#" >
<!ENTITY owl2xml "http://www.w3.org/2006/12/owl2-xml#" >
<!ENTITY snap "http://www.ifomis.org/bfo/1.1/snap#" >
<!ENTITY span "http://www.ifomis.org/bfo/1.1/span#" >
<!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#" >
<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#" >
<!ENTITY SPAM_Ontology_01 "http://www.SPAM_Ontology.owl/SPAM_Ontology_01#" >
<!ENTITY extending "http://www.semanticweb.org/ontologies/2 ... ending.owl#" >
]>
[/code]


Ich möchte einfach nur an die Entity-Definitionen heran, das muss doch gehen!?

Ich versuche es mit document.doctype().entities()

Diese NodeMap hat aber leider die Grösse 0. Bitte sagt mir es gibt eine Lösung, ich möchte nicht die DTD von Hand einlesen oder eine externe Bibliothek oder einen SAX Parser... brrr. Sowas simples muss doch klappen. Danke Euch!!!

Schöne Grüsse,
Frederick

Verfasst: 27. April 2011 16:29
von mccrashman
Also ich stehe seit einer Woche auch vor diesem Problem.

Ich gehe die Sache wie immer an, sprich ich hole mir mit "firstChild" den ersten Node und bekomme dann alle Entity Referenzen. Jedoch muss ich an die Entity Definitionen heran um dann an die dahinter verborgenen XML Dateien heran zu kommen.

Mein betreffender Quell sieht so aus:

Code: Alles auswählen

    if(bpackFileOpen)
    {
        QDomElement packElem = packDom.documentElement();
        QDomNode n = packElem.firstChild();
        while(!n.isNull())
        {
            QDomElement e = n.toElement(); // try to convert the node to an element.
            if(!e.isNull())
            {
                if(e.hasAttribute(packDeclName) && (e.tagName() == packDecl))
                {
                    items.append(new QTreeWidgetItem((QTreeWidget*)0, QStringList(e.attribute(packDeclName, cNoTargetName))));
                }
            }else{
                qtemp = n.nodeName();
                bool b;
                QDomEntityReference r;
                if(n.isEntityReference())
                {
                    r = n.toEntityReference();
                }
            }
            n = n.nextSibling();
        }

Die Lösung meines Rätzels

Verfasst: 28. April 2011 13:50
von mccrashman
Gut, ich habe leider keine Anleitung dafür gefunden, aber ich habe mir etwas zusammen gebastelt.

Im Prinzip ist es fanz einfach, wenn man weiß, dass das Document Entity's enthält, muss man sich erst mal die NamedNodeMap des Dokuments holen. Diese enthält alle im Dokument verfügbaren Entity's. Jetzt kann man beim durchlaufen aller Node's im Dokument, nach diversen Sicherheitsüberprüfungen, diese EntityReferenzen auflösen.

Code: Alles auswählen

    QString qtemp;
    if(bpackFileOpen)
    {
        QDomElement packElem = packDom.documentElement();
        QDomNode n = packElem.firstChild();
        QDomDocumentType qDomType = packDom.doctype();
        QDomNamedNodeMap qNodeMap = qDomType.entities();
        while(!n.isNull())
        {
            QDomElement e = n.toElement(); // try to convert the node to an element.
            if(e.isNull())                 // Node is not an Element
            {
                qtemp = n.nodeName();
                QDomEntityReference qEntityReference;
                QDomNode qEntityNode;
                QDomEntity qEntity;
                if(n.isEntityReference())   // Node is an EntityReference -> resolve it
                {
                    qEntityReference = n.toEntityReference();
                    if(qNodeMap.contains(qtemp))
                    {
                        qEntityNode = qNodeMap.namedItem(qtemp);
                        if(qEntityNode.isEntity())
                        {
                            qEntity = qEntityNode.toEntity();
                            qtemp = qEntity.systemId();
                        }
                    }
                }
            }
            n = n.nextSibling();
        }
    }