使用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调用.

最终的运行结果是:
[code]Node Name =: title
Node Value=: test_title[/code]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值