XML DOM XSD: Datentypen auslesen schlägt fehl

sellerie2001

Grünschnabel
Hallo,

ich habe ein Problem mit dem MS XML DOM Parser. Ich verwende die msxml5.dll (also die Office XML Bibliothek ohne Library .lib). Um XML Werte direkt in Variablen verschiedenen Datentyps zu parsen, habe ich ein XSD-Schema entworfen, welches ATTRIBUTE (keine Elemente) typisiert.
Beim Parsen werden über eine IXMLDOMNamedNodeMap die Attribute aus dem XML File gelesen und können über IXMLDOMNode* Zeiger einzeln bearbeitet werden. Rufe ich allerdings die IXMLDOMNode::get_datatype (VARIANT*) auf, so enthält das resultierende VARIANT keinen BSTR mit dem Datentyp, sondern VARIANT.vt ist 1, also BSTR ist NULL. Der Fehler wird unter der MSDN als "Datentyp ist nicht gesetzt" interpretiert. Die get_datatype Funktion bricht auch mit Rückgabewert S_FALSE ab. Woran liegt das? Müssen für das Parsen von Datentypen irgendwelche Flags gesetzt werden?
Außerdem: Wie kann ich Attribute parsen, die explizit nicht im XML File geschrieben wurden, aber im XSD Schema als "default" gesetzt sind?

XSD:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Save" type="SaveData"/>
<xsd:complexType name="SaveData">
<xsd:attribute name="ID" type="xsd:unsignedLong" fixed="1"/>
<xsd:attribute name="Filename" type="xsd:string" default="NULL"/>
<xsd:attribute name="Mode" type="xsd:string" default="VAL | MEAN"/>
</xsd:complexType>
</xsd:schema>

XML:
<source>
<Save Mode="VAL | MEAN"/>
</source>

cpp:
using namespace MSXML2;

IXMLDOMDocumentPtr docPtr;
IXMLDOMElementPtr ElementPtr;
IXMLDOMParseErrorPtr pError = NULL;
IXMLDOMNode *attItem = NULL, *lpNodeAttributeID = NULL;
IXMLDOMNamedNodeMap *attributeMap;

//init
CoInitialize(NULL);
docPtr.CreateInstance(__uuidof(DOMDocument50));
docPtr->validateOnParse = VARIANT_TRUE; // Validierung aktivieren
docPtr->resolveExternals = VARIANT_TRUE;

CString lstrXML = "<source><....";

// lade und validiere XML String in DOMDocument
HRESULT hr = docPtr->loadXML ((_bstr_t)lstrXML);

.......

// Den Kommandonamen parsen
ElementPtr->get_baseName (&lbstrBasename);
ElementPtr->get_attributes (&attributeMap);
long llAttlength = -1;
attributeMap->get_length (&llAttlength);
for (long j = 0; j < llAttlength; j ++)
{
attributeMap->get_item (j, &attItem);
_bstr_t bstrt = _T("int");
VARIANT var;

attItem->put_dataType ((BSTR) bstrt); // auch hiermit im nächsten Schritt NULL
int my = attItem->get_dataType (&var);
if (my == S_FALSE)
{ // WIRD IMMMER AUSGEFÜHRT
char mystring [1000];
sprintf (mystring, "my: %s", var.bstrVal);
MessageBox (mystring); // mystring ist: "(NULL)"
}

}
CoUninitialize();


Tut mir Leid, kann sein, dass der Quelltext durch das Zurechtkürzen etwas unformatiert ist...aber ich hoffe, man kann das Problem herauslesen...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück