怎样用DOM对XML文档进行动态查询(200分)

C

ctina

Unregistered / Unconfirmed
GUEST, unregistred user!
也就是让他进行过滤出需要显示的数据,而不符合条件的不显示
 
DOM是没有过滤功能的,它只是用树结构重建XML文档的结构。
XML可以构建查询条件,可参考W3C的:XML QUERY DATA MODEL和XML QUERY REQUIEMENT.
最直接的做法是DOM解析出树之后自己写判断条件来过滤。
比较现实的做法是现把XML导入支持XML数据类型的数据库,然后用SQL。
 
不要将 XML 用于搜索
///////////////////////
转自IBM上的一篇文章的部分章节,比我讲的清楚多了。
///////////////////////
XML 文档(按它们本身)不适合被搜索。由于它们只是纯文本,任何 XML 原始的搜索机制
(如 XPath)必须对整个文档(或多个文档)进行语法分析以找到您感兴趣的部分(或多
个部分)。如果试图搜索有七百万客户信息的单一文档,其效率会非常低。如果将文档分
成较小的文档 — 每个客户一个文档 — 问题依然发生:为了找到您正在查找的特殊客户
,需要对每个文档进行语法分析直到找到适当的那个为止。对于搜索 XML 文档,唯一好的
解决方案是引入某种索引机制 — 或者是关系数据库索引,或者是某种 XML 原始的索引工
具 — 这会极大地减少定位您感兴趣的文档(或文档片段)所必须处理的信息。当您有面向
数据的信息(与面向文本的信息,如书籍手稿,相反),关系数据库非常适合这项任务,
并且它还提供了其它好处。
 
to sythree:
msxml4.0里面好像有一个对象xslTemplate可以对xsl进行操作,已达到过滤xml,
我不是很清楚他的使用方法。
我问这个问题主要想用来对一些小数据量的记录集(<1000)不通过存取数据库达到过滤
的目的,对于大数据量量,我想还是比较赞成存取数据库来进行检索
 
为什么不可以?用任何的脚本语言都可以做到,只要它能识别XML的语法。
 
to wangli611:
拜托,请看清楚题目。
大家讨论的是“怎样用DOM对XML文档进行动态查询 ”,不是“怎样用脚本语言对XML文档
进行动态查询 ”
 
你要学学xsl的。
比如这样
procedure TDownList.Down();
var n,m,i,endm:integer;
tmpXml:IxmldomDocument;
tmpNode,Node2:IxmldomNodeList;
begin
try
CoInitialize(nil);
tmpxml := CreateOLEObject('Microsoft.XmlDom') as IXMLDOMDocument;
tmpxml.async :=false;
tmpxml.load(Url);
while tmpxml.readyState<>4do
begin
//i:=0;
end;
if tmpxml.parseError.errorCode <> 0 then
begin
CtGoBack:=tmpXml.parseError.url+'#'+tmpxml.parseError.reason+'#'+tmpxml.parseError.srcText;
Exit;
end;
tmpNode:=tmpXml.selectNodes('Forum/Topics/Topic');
//这里就是查询语句了。也可以加上查询条件的。
n:=tmpNode.length;
for i:=1 to ndo
begin
Node2:=tmpNode.item[i-1].childNodes;
endm:=Node2.length;
if (endm>7) then
endm:=7;
for m:=1 to endmdo
begin
aryList[i,m]:=node2.item[m-1].text;
end;
end;
finally
tmpxml:=nil;
CoUninitialize();
end;
end;

下面这个就是条件查询了 可以用and 或 | 来连接多个条件的。
xmlobj:= CreateOLEObject('Microsoft.XmlDom') as IXMLDOMDocument;
xmlobj.async := false;
xmlobj.load(tmp);
if xmlobj.parseError.errorCode <> 0 then
begin
showmessage('焦点帖子装入出错');
Exit;
end;
tmpNode:=xmlobj.documentElement.lastChild;
for i:=0 to CheckListbox1.Count-1do
begin
if checkListBox1.Checked=true then
begin
xSql:='/CSDN/Focus[@ID="'+ CheckListBox1.Items +'"]';
tmpNode2:=tmpNode.selectSingleNode(xSql);
if tmpNode2<>nil then
begin
xmlobj.documentElement.removeChild(tmpNode2);
end;
end;
end;
xmlobj.save(tmp);
 
有没有用JAVA实现的代码?
 
XSLT和XPath我都用得不多,应该可以满足一般需求了。
 
to :netnice
大家都是在学习,我也需要学习。
给你几百万条记录你还形而上学地用XSL吗?XSL只是一种基于XML文档结构的原始查询方式。
建议你看看IBM Developer网站上的:XML for Data: Four tips for smart architecture(http:
//www-106.ibm.com/developerworks/library/x-xdtips.html)
XSL到2.0之后已经分为了XSLT,XPATH和an expression language used by XSLT to access
or refer to parts of an XMLdo
cument了,所以现在大家已经没必要学XSL了。
 
多人接受答案了。
 
顶部