Re: Creating a DOM Document from HTTP Request of XML failing

Cris Rys <[email protected]> Mon, 12 Apr 2010 01:02:03 -0700
Newsgroups gmane.comp.mozilla.devel.dom
Message-ID <[email protected]>
To answer my own question, looking at the attribute value was incorrect.  Getting the interface for a nsIDOM3Node which I could call GetTextContent on was what I needed to do.   -cris


       nsCOMPtr<nsIDOM3Node> dom3Node = do_QueryInterface(element, &rv);
       NS_ENSURE_SUCCESS(rv, rv);

       nsString textContent;
       rv = dom3Node->GetTextContent(textContent);
       NS_ENSURE_SUCCESS(rv, rv);


On Apr 11, 2010, at 11:44 PM, Cris Rys wrote:

> On Tue, Apr 6, 2010 at 9:05 AM, Boris Zbarsky <[email protected]> wrote:
> > On 4/6/10 12:01 PM, Cris wrote:
> >>
> >> No headers. That XML was the entire output. I'm guessing this is the
> >> problem.
> >
> > Yep.  Either the server needs to claim the output is XML or you need to tell
> > your XHR to treat the data as XML no matter what the server says.
> >
> > -Boris
> >
>  
> Thank you Boris.   I am successfully able to create the Document. 
> 
> Walking through the document, I am able to GetTagName,  successfully, eg I get "first_name", "last_name", "uid", as tag names, but when call element->GetAttribute("value")  I get an empty string result.   Should I not be querying the element's value?  What should I be doing?
> 
> 
> The XML code is below, and the C++ code that is causing the error is below.
> 
> Thanks,
> 
> -cris
> -------
> 
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <users_getInfo_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/facebook.xsd" list="true">
>   <user>
>     <about_me xsi:nil="true"/>
>     <first_name>Cris</first_name>
>     <last_name>Rys</last_name>
>     <uid>693893361</uid>
>   </user>
> </users_getInfo_response>
> 
> -------
> 
> 	nsCOMPtr<nsIDOMDocument> document;
> 	rv = inXMLHttpRequest->GetResponseXML(getter_AddRefs(document));
> 	NS_ENSURE_SUCCESS(rv, rv);
> 	NS_ENSURE_TRUE(document, NS_ERROR_FAILURE);
>   
> 	nsCOMPtr<nsIDOMNodeList> userNodeList;
> 	rv = document->GetElementsByTagName(NS_LITERAL_STRING("user"),  getter_AddRefs(userNodeList));
> 	NS_ENSURE_STATE(userNodeList);
> 	NS_ENSURE_SUCCESS(rv, rv);
> 
> 	PRUint32 userNodeListLength = 0;
> 	rv = userNodeList->GetLength(&userNodeListLength);
> 	NS_ENSURE_SUCCESS(rv, rv);
> 
> 	nsCOMPtr<nsIDOMNode> userNode;
> 	rv = userNodeList->Item(0, getter_AddRefs(userNode));
> 	NS_ENSURE_SUCCESS(rv, rv);
> 
> 	nsCOMPtr<nsIDOMNodeList> childNodes;
> 	rv = userNode->GetChildNodes(getter_AddRefs(childNodes));
> 	NS_ENSURE_SUCCESS(rv, rv);
> 
> 	PRUint32 childNodeListLength = 0;
> 	rv = childNodes->GetLength(&childNodeListLength);
> 	NS_ENSURE_SUCCESS(rv, rv);
> 	
> 	nsString first_name, last_name, pic_square,profile_url, uidStr;
> 	uint64_t uid = 0;
> 
> 	for(PRUint32 i = 0; i < childNodeListLength; ++i) 
> 	{
> 		nsCOMPtr<nsIDOMNode> domNode;
> 		rv = childNodes->Item(i, getter_AddRefs(domNode));
> 		NS_ENSURE_SUCCESS(rv, rv);
> 
> 		nsCOMPtr<nsIDOMElement> element = do_QueryInterface(domNode, &rv);
> 		if(NS_FAILED(rv)) 
> 		{
> 		  continue;
> 		}
> 
> 		nsString tagName;
> 		rv = element->GetTagName(tagName);  // successfully gets names of "first_name", "last_name", "uid"
> 		NS_ENSURE_SUCCESS(rv, rv);
> 
> 		nsString value;
> 		rv = element->GetAttribute(NS_LITERAL_STRING("value"), value);  // but attribute value is an empty string
> 		if(NS_FAILED(rv)) 
> 		{
> 		  continue;
> 		}
> 
> 		if(tagName.EqualsLiteral("first_name")) 
> 		{
> 			first_name = value; 
> 		}
> 		else if(tagName.EqualsLiteral("last_name")) 
> 		{
> 			last_name = value;
> 		} 
> 		else if(tagName.EqualsLiteral("uid")) 
> 		{
> 			uidStr = value;
> 		} 
> 		
> 	}
> 
> 
> 
> 
> 
>