obtener el valor de un float con XSD

Davinia
25 de Marzo del 2004
Hola,
quiero leer un float de un fichero XML pero cuando recojo el valor con:
hr = pNodeAttrPrice->get_nodeValue(&value);

lo guarda como cadena, ya que entra en el siguiente if:

if(value.vt == VT_BSTR)
printf("is a string %sn", value.bstrVal); //muestra el valor como
cadena

printf("valor: %fn", value.fltVal); //muestra 0.000

.
¿Que estoy haciendo mal?


/**********myfile.xml****************/
<?xml version="1.0"?>
<Library xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="mifile.xsd">
<Book price = "20.5"></Book>
</Library>

/******myfile.xsd**********/
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="Library">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Book" maxOccurs="unbounded">
<xsd:complexType>
<xsd:attribute name="price" type="xsd:float" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>



//File .cpp Estoy usando MSXML 4.0 en VisualC++

int main()
{
IXMLDOMDocument2Ptr pXMLDom;
IXMLDOMNodeListPtr pNodeChildrenLibrary = NULL;
IXMLDOMNodePtr pNodeBook = NULL;
IXMLDOMNamedNodeMapPtr pAttrListBook = NULL;
IXMLDOMNodePtr pNodeAttrPrice = NULL;
HRESULT hr;

CoInitialize(NULL);

hr = pXMLDom.CreateInstance(__uuidof(DOMDocument40));
if (FAILED(hr))
{
printf("Failed to instantiate DOMDocument40 classn");
return NULL;
}

pXMLDom->async = VARIANT_FALSE;
pXMLDom->validateOnParse = VARIANT_TRUE;
pXMLDom->resolveExternals = VARIANT_TRUE;

if ( pXMLDom->load("myfile.xml") != VARIANT_TRUE)
{
printf("Failed load xml data from file.n%sn",
(LPCSTR)pXMLDom->parseError->Getreason());
return NULL;
}

pNodeChildrenLibrary = pXMLDom->selectNodes("//Library[1]/*");
printf("Lenght: %dn",pNodeChildrenLibrary->length);

pNodeBook = pNodeChildrenLibrary->item[0];
pAttrListBook = pNodeBook->attributes;
pNodeAttrPrice = pAttrListBook->item[0];
MessageBox(NULL, (LPCSTR)pNodeAttrPrice->text, "Price:", MB_OK);

VARIANT value;

hr = pNodeAttrPrice->get_nodeValue(&value);

if(value.vt == VT_BSTR)
printf("is a string %sn", value.bstrVal);

printf("valor: %fn", value.fltVal);

pNodeChildrenLibrary.Release();
pNodeBook.Release();
pAttrListBook.Release();
pNodeAttrPrice.Release();

CoUninitialize();
return NULL;
}