I need to parse a URL into a nsIDOMHTMLDocument. Using the code below I was
able to successfully do that, but when I step through the nodes of the
document and try to do a GetValue() on the text nodes I always get a blank
line.
Below is the code I'm using. If someone can see something obviously wrong
with it please let me know. I have a standalone program that I can send
anyone who wants to try it.
Thanks for any help,
Bill Phillips
nsString outString;
nsCOMPtr<nsIURI> url;
rv = NS_NewURI(getter_AddRefs(url), inString.ToNewCString());
nsCOMPtr<nsIInputStream> inputStream;
rv = NS_OpenURI(getter_AddRefs(inputStream), url);
NS_WITH_SERVICE(nsIWebShell, webshell, kWebShellCID, &rv);
NS_WITH_SERVICE(nsIParser, parser, kCParserCID, &rv);
nsCOMPtr<nsIDocument> doc;
rv = NS_NewHTMLDocument(getter_AddRefs(doc));
if (NS_FAILED(rv))
{
printf("Unable to create a parser : 0x%x\n", rv);
return NS_ERROR_FAILURE;
}
nsCOMPtr<nsIHTMLContentSink> sink;
rv = NS_NewHTMLContentSink(getter_AddRefs(sink), doc, url, webshell);
parser->SetContentSink(sink);
parser->SetContentSink(sink);
nsCOMPtr<nsIDTD> dtd = nsnull;
if (inType.EqualsWithConversion("text/xif"))
rv = NS_NewXIFDTD(getter_AddRefs(dtd));
else
rv = NS_NewNavHTMLDTD(getter_AddRefs(dtd));
if (NS_FAILED(rv))
{
printf("Couldn't create new HTML DTD: 0x%x\n", rv);
return rv;
}
parser->RegisterDTD(dtd);
rv = parser->Parse(*inputStream, NS_ConvertASCIItoUCS2("text/html"));
if (NS_FAILED(rv))
{
printf("Parse() failed! 0x%x\n", rv);
return rv;
}
nsCOMPtr<nsIDOMHTMLDocument> domdoc;
rv = doc->QueryInterface(nsIDOMHTMLDocument::GetIID(),
getter_AddRefs(domdoc));
printf("Parse_URL() - after nsIDOMHTMLDocument QI result = 0x%x\n", rv);
nsString title;
domdoc->GetTitle(title);
printf("Parse_URL() - Document title = %s\n", title.ToNewUTF8String());
nsCOMPtr<nsIDOMHTMLElement> body;
rv = domdoc->GetBody(getter_AddRefs(body));
printf("Parse_URL() - after GetBody rv = 0x%x\n", rv);
nsCOMPtr<nsIDOMNodeList> nodelist;
rv = body->GetChildNodes(getter_AddRefs(nodelist));
printf("Parse_URL() - after GetChildNodes rv = 0x%x\n", rv);
PRUint32 numnodes;
nodelist->GetLength(&numnodes);
printf("Parse_URL() - Number of nodes = %d\n", numnodes);
nsCOMPtr<nsIDOMNode> node;
PRUint16 nodetype;
for(unsigned int i = 0; i < numnodes; i++)
{
nodelist->Item(i, getter_AddRefs(node));
node->GetNodeType(&nodetype);
printf("Parse_URL() - Node #%d, type is %d\n", i, nodetype);
if(nodetype == nsIDOMNode::TEXT_NODE)
{
nsAutoString nodename;
node->GetNodeName(nodename);
printf(" Parse_URL() - Node #%d, name is %s\n", i,
nodename.ToNewCString());
nsAutoString nodevalue;
node->GetNodeValue(nodevalue);
printf(" Parse_URL() - Node #%d, value is %s\n", i,
nodevalue.ToNewCString());
}
}