2009-11-30 13 views
2

Je reçois du code XML sur un socket réseau. Je dois prendre ce XML et le charger dans le DOM pour effectuer d'autres opérations. MSXML requiert des chaînes d'entrée qui sont dans UCS-2 ou UTF-16 et ignore complètement l'en-tête XML avec le type de codage lors du chargement à partir d'une chaîne. Il permet le chargement de fragments XML, donc cela a du sens.Chargement du code XML en C++ MSXML à partir du tableau d'octets

Je vois deux façons possibles de traiter ce problème:

1) le fichier sur le disque et le charger dans MSXML via les chemins de fichiers. L'E/S disque supplémentaire rend cette approche loin d'être préférée.

2) Pic dans l'en-tête XML pour détecter manuellement le codage, puis appeler MultiByteToWideChar pour convertir en UTF-16 et spécifier la page de code en fonction du codage détecté. Cette approche fonctionne bien, mais j'aimerais pousser la détection d'encodage sur MSXML.

Est-ce que quelqu'un a d'autres idées sur la façon d'accomplir cela?

Je n'ai pas examiné d'autres analyseurs XML, mais j'aimerais savoir comment les parseurs DOM non-MSXML accomplissent cela.

Merci, Paul

Répondre

1

simple est passer la fonction de charge un tableau sécurisé. par exemple.

const char* xml = "<root/>"; 

SAFEARRAYBOUND rgsabound[1]; 
rgsabound[0].lLbound = 0; 
rgsabound[0].cElements = strlen(xml); 

SAFEARRAY* psa = SafeArrayCreate(VT_UI1, 1, rgsabound); 
memcpy(psa->pvData, xml, strlen(xml)); 
VARIANT v; 

VariantInit(&v); 
V_VT(&v) = VT_ARRAY | VT_UI1; 
V_ARRAY(&v) = psa; 
VARIANT_BOOL fSuccess; 
pXMLDoc->load(v, &fSuccess); 
if(fSuccess == VARIANT_TRUE) 
{ 
    /* Do Something */ 
} 

De toute évidence aucune vérification d'erreur en cours ou de libérer des ressources.

Ou utilisez CreateStreamOnHGlobal pour créer un IStream sur les données et le transmettre en charge.