开帖纪念,dxpcom终于可以使用了.
找了好半天,才知道怎么使用mozilla xpcom进行HTML的DOM解析.
解析使用的组件是"@mozilla.org/xmlextras/domparser;1",可以解析HTML和XML.解析使用的接口是nsIDOMParser.
代码如下,保存时要注意为UTF-8格式,不然无法用DMD编译.
看上去好像很繁琐,但等D的异常风格包装完事后,会好看的多!
再次对qiezi的工作表示敬意!为我们提供了在D中使用xpcom的可能!
:)
其他不明的相关事宜,请大家讨论.
这次修改,加入了Release调用.
最终的运行结果是:
[code]Node Name =: title
Node Value=: test_title[/code]
找了好半天,才知道怎么使用mozilla xpcom进行HTML的DOM解析.
解析使用的组件是"@mozilla.org/xmlextras/domparser;1",可以解析HTML和XML.解析使用的接口是nsIDOMParser.
代码如下,保存时要注意为UTF-8格式,不然无法用DMD编译.
import mozilla.xpcom.nsXPCOM;
import mozilla.xpcom.nsIDOMParser;
import mozilla.xpcom.nsIComponentManager;
import mozilla.xpcom.nsIDOMDocument;
import mozilla.xpcom.nsIDOMHTMLDocument;
import mozilla.xpcom.nsISupports;
import mozilla.dxpcom.StringAPI;
import mozilla.dxpcom.QueryInterface;
import std.string;
import std.stdio;
void main(char[][] args)
{
//定义xpcom组件管理器接口
nsIComponentManager componentManager;
nsresult result;
//定义一个临时使用的空串
AString tStr=new AString();
//初始化xpcom环境
result = NS_InitXPCOM2(null, null, null);
assert(result==0);
//得到xpcom组件管理端接口
result = NS_GetComponentManager(&componentManager);
assert(result==0);
//定义DOM解析器接口
nsIDOMParser DOMParser;
//使用xpcom组件管理端,从指定的组件中得到指定的接口
result = componentManager.CreateInstanceByContractID("@mozilla.org/xmlextras/domparser;1",null,
&nsIDOMParser.IID,cast(void**)&DOMParser);
assert(result==0);
//定义待解析的HTML文本串
PRUnichar HtmlStr[]=r"<html><head><title>test_title</title></head><body><al>test</al></body></html>"w;
//定义DOM文档对象接口
nsIDOMDocument DOMDoc;
//使用DOM解析接口解析html文本串,得到DOM文档对象接口
result=DOMParser.ParseFromString(cast(PRUnichar*)HtmlStr,"application/xhtml+xml",&DOMDoc);
assert(result==0);
DOMParser.Release();
/*
//得到文档的类型
nsIDOMDocumentType DocType;
result=DOMDoc.GetName(&DocType);
assert(result==0);
result=DocType.GetInternalSubset(cast(nsAString*)tStr);
assert(result==0);
writefln("Doc Type=: %s", tStr.GetString());*/
//定义DOM节点列表接口
nsIDOMNodeList NodeList;
//定义待解析得到的节点的名字
AString TagName = new AString("title"w);
//解析得到节点列表
result=DOMDoc.GetElementsByTagName(cast(nsAString*)TagName,&NodeList);
assert(result==0);
//定义DOM节点接口
nsIDOMNode Node;
uint Len=0;
//判断节点列表是否为空
result=NodeList.GetLength(&Len);
assert(result==0&&Len!=0);
//从节点列表中得到一个节点
result=NodeList.Item(0,&Node);
assert(result==0);
NodeList.Release();
//得到这个节点的名字
result=Node.GetNodeName(cast(nsAString*)tStr);
assert(result==0);
//显示这个节点的名字
wchar wStr[]=tStr.GetString();
Len=wStr.length;
writefln("Node Name =: %s", wStr);
//再定义一个节点接口,用于表示子节点
nsIDOMNode cNode;
//得到这个节点的子节点
result=Node.GetFirstChild(&cNode);
assert(result==0);
//得到子节点的值
result=cNode.GetNodeValue(cast(nsAString*)tStr);
assert(result==0);
cNode.Release();
//显示这个子节点的值
wStr=tStr.GetString();
writefln("Node Value=: %s", wStr);
//释放所有用过的接口
Node.Release();
DOMDoc.Release();
componentManager.Release();
//关闭xpcom环境
result = NS_ShutdownXPCOM(null);
assert(result==0);
}
看上去好像很繁琐,但等D的异常风格包装完事后,会好看的多!
再次对qiezi的工作表示敬意!为我们提供了在D中使用xpcom的可能!
:)
其他不明的相关事宜,请大家讨论.
这次修改,加入了Release调用.
最终的运行结果是:
[code]Node Name =: title
Node Value=: test_title[/code]