使用Dxpcom进行HTML文本的DOM解析

    开帖纪念,dxpcom终于可以使用了.
    找了好半天,才知道怎么使用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调用.

最终的运行结果是:
Node Name =: title
Node Value=: test_title

你可能感兴趣的:(html,xml,D语言,DXPCOM)