parse XML

来源:互联网 发布:silverlight 5 mac 编辑:程序博客网 时间:2024/04/30 00:22

http://www.cnblogs.com/Dragon-China/archive/2007/05/29/764081.html



之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素。可以把XPath比作文件管理路径:通过文件管理路径,可以按照一定的规则查找到所需要的文件;同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点.

  不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分。

  在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基本概念。

  首先要说的是XPath数据类型。XPath可分为四种数据类型:

  1. 节点集(node-set)
    节点集是通过路径匹配返回的符合条件的一组节点的集合。其它类型的数据不能转换为节点集。
  2. 布尔值(boolean)
    由函数或布尔表达式返回的条件匹配值,与一般语言中的布尔值相同,有true和false两个值。布尔值可以和数值类型、字符串类型相互转换。
  3. 字符串(string)
    字符串即包含一系列字符的集合,XPath中提供了一系列的字符串函数。字符串可与数值类型、布尔值类型的数据相互转换。
  4. 数值(number)
    在XPath 中数值为浮点数,可以是双精度64位浮点数。另外包括一些数值的特殊描述,如非数值NaN(Not-a-Number)、正无穷大infinity、负无 穷大-infinity、正负0等等。number的整数值可以通过函数取得,另外,数值也可以和布尔类型、字符串类型相互转换。

  其中后三种数据类型与其它编程语言中相应的数据类型差不多,只是第一种数据类型是XML文档树的特有产物。

  另外,由于XPath包含的是对文档结构树的一系列操作,因此搞清楚XPath节点类型也是很必要的。回忆一下第二章中讲到的XML文档的逻辑结构,一个XML文件可以包含元素、CDATA、注释、处理指令等逻辑要素,其中元素还可以包含属性,并可以利用属性来定义命名空间。相应地,在XPath中,将节点划分为七种节点类型:

  1. 根节点(Root Node)
    根节点是一棵树的最上层,根节点是唯一的。树上其它所有元素节点都是它的子节点或后代节点。对根节点的处理机制与其它节点相同。在XSLT中对树的匹配总是先从根节点开始。
  2. 元素节点(Element Nodes)
    元素节点对应于文档中的每一个元素,一个元素节点的子节点可以是元素节点、注释节点、处理指令节点和文本节点。可以为元素节点定义一个唯一的标识id。
    元素节点都可以有扩展名,它是由两部分组成的:一部分是命名空间URI,另一部分是本地的命名。
  3. 文本节点(Text Nodes)
    文本节点包含了一组字符数据,即CDATA中包含的字符。任何一个文本节点都不会有紧邻的兄弟文本节点,而且文本节点没有扩展名。
  4. 属性节点(Attribute Nodes)
    每 一个元素节点有一个相关联的属性节点集合,元素是每个属性节点的父节点,但属性节点却不是其父元素的子节点。这就是说,通过查找元素的子节点可以匹配出元 素的属性节点,但反过来不成立,只是单向的。再有,元素的属性节点没有共享性,也就是说不同的元素节点不共有同一个属性节点。
    对缺省属性的处理等同于定义了的属性。如果一个属性是在DTD声明的,但声明为#IMPLIED,而该属性没有在元素中定义,则该元素的属性节点集中不包含该属性。
    此外,与属性相对应的属性节点都没有命名空间的声明。命名空间属性对应着另一种类型的节点。
  5. 命名空间节点(Namespace Nodes)
    每一个元素节点都有一个相关的命名空间节点集。在XML文档中,命名空间是通过保留属性声明的,因此,在XPath中,该类节点与属性节点极为相似,它们与父元素之间的关系是单向的,并且不具有共享性。
  6. 处理指令节点(Processing Instruction Nodes)
    处理指令节点对应于XML文档中的每一条处理指令。它也有扩展名,扩展名的本地命名指向处理对象,而命名空间部分为空。
  7. 注释节点(Comment Nodes)
    注释节点对应于文档中的注释。

下面,我们来构造一棵XML文档树,作为后面举例的依托:

<A id="a1">
  <B id="b1">
    <C id="c1">
      <B name="b"/>
      <D id="d1"/>
      <E id="e1"/>
      <E id="e2"/>
    </C>
  </B>
  <B id="b2"/>
  <C id="c2">
    <B/>
    <D id="d2"/>
    <F/>
  </C>
  <E/>
</A>

现在,我们就来介绍一些XPath中节点匹配的基本方法。

  1. 路径匹配
    路径匹配与文件路径的表示相仿,比较好理解。有以下几个符号:
    符  号 含  义 举  例 匹配结果
    /指示节点路径/A/C/D节点"A"的子节点"C"的子节点"D",即id值为d2的D节点
    /根节点
    //所有路径以"//"后指定的子路径结尾的元素//E所有E元素,结果是所有三个E元素
    //C/E所有父节点为C的E元素,结果是id值为e1和e2的两个E元素
    *路径的通配符/A/B/C/*A元素→B元素→C元素下的所有子元素,即name值为b的B元素、id值为d1的D元素和id值为e1和e2的两个E元素
    /*/*/D上面有两级节点的D元素,匹配结果是id值为d2的D元素
    //*所有的元素
    |逻辑或//B | //C所有B元素和C元素


  2. 位置匹配
    对于每一个元素,它的各个子元素是有序的。如:
    举  例 含  义 匹配结果
    /A/B/C[1]A元素→B元素→C元素的第一个子元素name值为b的B元素
    /A/B/C[last()]A元素→B元素→C元素的最后一个子元素id值为e2的E元素
    /A/B/C[position()>1]A元素→B元素→C元素之下的位置号大于1的元素id值为d1的D元素和两个具有id值的E元素


  3. 属性及属性
    在XPath中可以利用属性及属性值来匹配元素,要注意的是,元素的属性名前要有"@"前缀。例如:
    举  例 含  义 匹配结果
    //B[@id]所有具有属性id的B元素id值为b1和b2的两个B元素
    //B[@*]所有具有属性的B元素两个具有id属性的B元素和一个具有name属性B元素
    //B[not(@*)]所有不具有属性的B元素A元素→C元素下的B元素
    //B[@id="b1"]id值为b1的B元素A元素下的B元素


  4. 亲属关系匹配
    XML文档可归结为树型结构,因此任何一个节点都不是孤立的。通常我们把节点之间的归属关系归结为一种亲属关系,如父亲、孩子、祖先、后代、兄弟等等。在对元素进行匹配时,同样可以用到这些概念。例如:
    举  例 含  义 匹配结果
    //E/parent::*所有E节点的父节点元素id值为a1的A元素和id值为c1的C元素
    //F/ancestor::*所有F元素的祖先节点元素id值为a1的A元素和id值为c2的C元素
    /A/child::*A的子元素id值为b1、b2的B元素,id值为c2的C元素,以及没有任何属性的E元素
    /A/descendant::*A的所有后代元素除A元素以外的所有其它元素
    //F/self::*所有F的自身元素F元素本身
    //F/ancestor-or-self::*所有F元素及它的祖先节点元素F元素、F元素的父节点C元素和A元素
    /A/C/descendant-or-self::*所有A元素→C元素及它们的后代元素id值为c2的C元素、该元素的子元素B、D、F元素
    /A/C/following-sibling::*A元素→C元素的紧邻的后序所有兄弟节点元素没有任何属性的E元素
    /A/C/preceding-sibling::*A元素→C元素的紧邻的前面所有兄弟节点元素id值为b1和b2的两个B元素
    /A/B/C/following::*A元素→B元素→C元素的后序的所有元素id为b2的B元素、无属性的C元素、无属性的B元素、id为d2的D元素、无属性的F元素、无属性的E元素。
    /A/C/preceding::*A元素→C元素的前面的所有元素id为b2的B元素、id为e2的E元素、id为e1的E元素、id为d1的D元素、name为b的B元素、id为c1的C元素、id为b1的B元素

  5. 条件匹配   
    条件匹配就是利用一些函数的运算结果的布尔值来匹配符合条件的节点。常用于条件匹配的函数有四大类:节点函数、字符串函数、数值函    数、布尔函数。例如前面提到的last()、position()等等。这些功能函数可以帮助我们精确寻找需要的节点。


函数及功能
作用

count()功能
统计计数,返回符合条件的节点的个数

number()功能
将属性的值中的文本转换为数值

substring() 功能

语法:substring(value, start, length)


截取字符串

sum()功能

求和

 

 

这些功能只是XPath语法中的一部分,还有大量的功能函数没有介绍,而且目前XPath的语法仍然在不断发展中。通过这些函数我们可以实现更加复杂的查询和操作。

以上这些匹配方法中,用得最多的还要数路径匹配。依靠给出相对于当前路径的子路径来定位节点的。





 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//建立文档对象
            try
            {
                doc.Load("../../myOrder.xml");
                XmlNode root = doc.DocumentElement;//获取文档的根节点
                XmlNode temp;
                temp = root.SelectSingleNode("姓名");
                Console.WriteLine("(查找1)" + temp);
                temp = root.SelectSingleNode("定购人信息/姓名");
                Console.WriteLine("(查找2)" + temp.Name+":"+temp.InnerText);
                temp = root.SelectSingleNode("订货信息/商品/品名");
                Console.WriteLine("(查找3)" + temp.Name + ":" + temp.InnerText);
                XmlNodeList templist = root.SelectNodes("订货信息/商品/品名");
                Console.WriteLine("(查找4)");
                foreach (XmlNode nodeinlist in templist)
                {
                    Console.WriteLine(nodeinlist.Name + ":" + nodeinlist.InnerText);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();//辅助代码,用于保留控制台窗口
        }
    }
}




 

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlDocument doc = new XmlDocument();//建立文档对象
            try
            {
                doc.Load("../../myOrder.xml");
                //在xmlDocument对象中搜索元素
                Console.WriteLine("");
                XmlNodeList myNodeList = doc.GetElementsByTagName("品名");
                for (int i = 0; i < myNodeList;i++ )
                {
                    Console.WriteLine(myNodeList[i].Name+":"+myNodeList[i].InnerText);
                }
                //在xmlElement对象中搜索元素
                Console.WriteLine("在xmlElement对象中搜索元素");
                XmlElement myElement = doc.DocumentElement;
                myElement = (XmlElement)myElement.LastChild;
                myNodeList = myElement.GetElementsByTagName("品名");
                for (int i = 0; i < myNodeList; i++)
                {
                    Console.WriteLine(myNodeList[i].Name + ":" + myNodeList[i].InnerText);

                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            Console.ReadLine();//辅助代码,用于保留控制台窗口
        }
    }
}

 

 

http://hi.baidu.com/d_yll/blog/item/7323fdfea67455325d60084f.html

JDOM XPATH XML (转)
2007-12-10 22:20

简单易懂,收藏了~~~~~

前言

XML是一种优秀的数据打包和数据交换的形式,在当今XML大行于天下,如果没有听说过它的大名,那可真是孤陋寡闻了。用XML描述数据的优势显而易见,它具有结构简单,便于人和机器阅读的双重功效,并弥补了关系型数据对客观世界中真实数据描述能力的不足。W3C组织根据技术领域的需要,制定出了XML的格式规范,并相应的建立了描述模型,简称DOM。各种流行的程序设计语言都纷纷根据这一模型推出了自己的XML解析器,在JAVA世界里,APACHE组织开发的XERCES应该是流行最广功能最为强大的XML解析器之一。但是由于W3C在设计DOM模型时,并不是针对某一种语言而设计,因此为了通用性,加入了许多繁琐而不必要的细节,使JAVA程序员在开发XML的应用程序过程中感到不甚方便,因此JDOM作为一种新型的XML解析器横空出世,它不遵循DOM模型,建立了自己独立的一套JDOM模型(注意JDOM决不是DOM扩展,虽然名字差不多,但两者是平行的关系),并提供功能强大使用方便的类库,使JAVA程序员可以更为高效的开发自己的XML应用程序,并极大的减少了代码量,因此它很快得到了业内的认可,如JBUILDER这样的航空母舰级的重磅产品都以JDOM为XML解析引擎,足见其名不虚传。

有了XML数据的描述标准,人们自然就会想到应该有一种查询语言可以在XML中查找任意节点的数据,就像SQL语句可以在关系性数据库中执行查询操作一样,于是XQUERY和XPATH顺应潮流,应运而生。由于XQUERY较为复杂,使用不甚方便,XPATH渐渐成为主流,我们只需对XPATH进行学习,便可以应付所有的查询要求。在JDOM发布的最新的V1.0bata10版中,已经加入了对XPATH的支持,这无疑是令开发者十分激动的。

学会JDOM和XPATH,你便不再是XML的入门者,在未来的开发生涯中,就像特种兵的多用匕首,为你披荆斩棘,助你勇往直前。闲言少叙,学习还要脚踏实地,从头开始。

XPATH速成篇

XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)。XPATH的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型。XPATH基本上和在文件系统中寻找文件类似,如果路径是以"/"开头的,就表明该路径表示的是一个绝对路径,这和在UNIX系统中关于文件路径的定义是一致的。以"//"开头则表示在文档中的任意位置查找。

不谈泛泛的理论,学习XPATH还要从实例学起最为快捷,并有助于你举一反三。

下面的样例XML文档,描述了某台电脑中硬盘的基本信息(根节点<HD>代表硬盘,<disk>标签代表硬盘分区,从它的 name属性可以看出有两个盘符名称为"C"和"D"的分区;每个分区下都包含<capacity>,< directories><files>三个节点,分别代表了分区的空间大小、目录数量、所含文件个数):


<?xml version="1.0" encoding="UTF-8"?>
<HD>
<disk name="C">
<capacity>8G</capacity>
<directories>200</directories>
<files>1580</files>
</disk>
<disk name="D">
<capacity>10G</capacity>
<directories>500</directories>
<files>3000</files>
</disk>
</HD>

你在XML文档中使用位置路径表达式来查找信息,这些表达式有很多种组成方式。

结点元素的查找是你将要碰到的最频繁的查找方式。在上面这个XML文档例子中,根HD包含disk结点。你可以使用路径来查找这些结点,用正斜杠(/)来分隔子结点,返回所有与模式相匹配的元素。下面的XPATH 语句返回所有的disk元素:

/HD/disk

"*"代表"全部"的意思。/HD/* 代表HD下的全部节点。

下面的XPATH将返回任意节点下的名称为disk的全部节点:

//disk

下面的XPATH将返回名称为disk,name属性为'C'的全部节点:

/HD/disk[@name='C']

节点的附加元素,比如属性,函数等都要用方括号扩起来,属性前面要加上@号

下面的XPATH将返回文件个数为1580的files节点:

/HD/disk/files[text()='1580']

大家注意到上面包含一个text(),这就是XPATH的一个函数,它的功能是取出当前节点的文本。

下面的XPATH将返回文件个数为1580的分区:

/HD/disk/files[text()='1580']/parent::*

最后的parent::*表示这个元素的所有的父节点的集合。

XPATH中一些有用的函数:

string concat(string, string, string*)联接两个字符串
boolean starts-with(string, string)判断某字符串是否以另一字符串开头
boolean contains(string, string)判断某字符串是否包含另一字符串
string substring(string, number, number)取子字符串
number string-length(string)测字符串长度
number sum(node-set)求和
number floor(number)求小于此数的最大整数值
number ceiling(number)求大于此数最小整数值

XPATH具有丰富的表达功能,上面这些已经基本够用,在你做项目中就会发现根据实际情况有许多查询需求,你应该参考本文最后提供的W3C发布的关于 XAPH的官方资料进行查阅,我在这里只起一个抛砖引玉的作用,在下面的章节中,我们的应用范例将不会超出上面提到的这些内容,如果你对XPATH感兴趣,应该在读完本文后,查找相关资料和书籍进行深入学习。

JDOM修炼篇

用过XERCES的程序员都会感到,有时候用一句话就可以说清楚的事,当用XERCES的API来实现时,要三四行程序。

获得并安装JDOM

http://www.jdom.org/ 可以下载JDOM的最新版本,将压缩包中的jdom.jar及lib目录下的全部jar包加入到classpath就可以了。

用JDOM解析XML

JDOM模型的全部类都在org.jdom.*这个包里,org.jdom.input.*这个包里包含了JDOM的解析器,其中的DOMBuilder 的功能是将DOM模型的Document解析成JDOM模型的Document;SAXBuilder的功能是从文件或流中解析出符合JDOM模型的 XML树。由于我们的上面提到的XML样例存储在一个名称为sample.xml的文件中,很显然我们应该采用后者作为解析工具。下面程序演示了jdom 的基本功能,即解析一个xml文档,并挑选一些内容输出到屏幕上。


import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
public class Sample1 {
public static void main(String[] args) throws Exception{
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build("sample.xml");
Element root=doc.getRootElement();
List list=root.getChildren("disk");
for(int i=0;i<list.size();i++){
Element element=(Element)list.get(i);
String name=element.getAttributeValue("name");
String capacity=element.getChildText("capacity");
String directories=element.getChildText("directories");
String files=element.getChildText("files");
System.out.println("磁盘信息:");
System.out.println("分区盘符:"+name);
System.out.println("分区容量:"+capacity);
System.out.println("目录数:"+directories);
System.out.println("文件数:"+files);
System.out.println("-----------------------------------");
}
}
}

程序的输出结果:


磁盘信息:

分区盘符:C

分区容量:8G

目录数:200

文件数:1580

-----------------------------------

磁盘信息:

分区盘符:D

分区容量:10G

目录数:500

文件数:3000

-----------------------------------

这段程序采用了传统的解析方式,一级一级的从根节点到子节点逐个采集我们所需要的数据,中规中矩。试想如果这个树足够深,我们想取第5 0层第三个节点的数据(夸张了点,呵呵),那将是一场噩梦!下面的内容将轻松化解你的这一痛苦。

JDOM+XPATH进阶篇

说了那么多JDOM和XPATH的好处,终于到了英雄有用武之地的时候了。

JDOM的关于XPATH的api在org.jdom.xpath这个包里。看看这个包下,只有一个类,JDOM就是如此简洁,什么事都不故弄玄虚的搞得那么复杂。这个类中的核心的api主要是两个selectNodes()和selectSingleNode()。前者根据一个xpath语句返回一组节点;后者根据一个xpath语句返回符合条件的第一个节点。

下面的程序我们用JDOM+XPATH实现了上一个程序同样的功能,你可以从中学到不少运用XPATH 的知识:


import java.util.*;
import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.xpath.XPath;
public class Sample2 {
public static void main(String[] args) throws Exception {
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build("sample.xml");
Element root = doc.getRootElement();
List list = XPath.selectNodes(root, "/HD/disk");
for (int i = 0; i > list.size(); i++) {
Element disk_element = (Element) list.get(i);
String name = disk_element.getAttributeValue("name");
String capacity = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/capacity/text()")).getTextNormalize();
String directories = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/directories/text()")).getTextNormalize();
String files = ( (Text) XPath.selectSingleNode(disk_element,
"//disk[@name='" + name + "']/files/text()")).getTextNormalize();
System.out.println("磁盘信息:");
System.out.println("分区盘符:" + name);
System.out.println("分区容量:" + capacity);
System.out.println("目录数:" + directories);
System.out.println("文件数:" + files);
System.out.println("-----------------------------------");
}
}
}

输出结果:


磁盘信息:

分区盘符:C

分区容量:8G

目录数:200

文件数:1580

-----------------------------------

磁盘信息:

分区盘符:D

分区容量:10G

目录数:500

文件数:3000

-----------------------------------

结语

技术在日新月异的发展。永远没有学过后,便可以一劳永逸的技术。XML的发展一日千里。W3C作为INTERNET方面的权威组织指导着互联网技术的发展方向。新技术的出现大都围绕着W3C制订的标准,但往往有些“旁门左道”的另类功法却能产生惊人的杀伤力。JDOM就是这众多旁门中的一朵奇葩。就像 J2EE大行其道的今天,有许多开源组织仍旧在默默的打造着自己的独家兵器,谁又能说在不久的将来,他们不会成为划时代的创造呢? 君不见Hibernate的兴起正在有力的震撼着J2EE中EJB架构的基石。只要是成型的框架,必然有薄弱的软肋。新的技术只要能攻入对方这一弱点,便可在业界站一席之地。本文只起抛砖引玉的作用,相信读者在吃过这道快餐之后,一定会发现窗外有更美丽的风景等待我们去游历。

 

http://blog.csdn.net/truelove12/archive/2007/11/06/1869925.aspx

新一篇: 如何对HTML中的li(ul,ol)中的值进行正向及反向排序 | 

一个使用VS2005,.Net FrameWork 2.0在XML元素中进行模糊查询的DEMO,希望对你用..

我不能保证这个地址(http://msdn.microsoft.com/globalrss/zh-cn/global-MSDN-zh-cn.xml)始终有效,如果该地址

不可用,可以使用任何使用rss标准的xml做为替代.

index.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
<title>Untitled Page</title>
</head>
<body>

<form method="post" action="searchByStream.aspx" >
<input id="txtQ" name="txtQ" type="text" /> <input id="SubmitStream" type="submit" value="搜索流" />
</form>

</body>
</html>
searchByStream.aspx
<%@ Page EnableViewState="false" Language="vb" AutoEventWireup="false" CodeBehind="searchByStream.aspx.vb" Inherits="testWebForm.searchByStream" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
    
<asp:Repeater ID="rep" runat="server">
    
<HeaderTemplate><ul></HeaderTemplate>
    
<ItemTemplate>
    
<li runat="server" id="msdnItem"><href='<%# xpath("link") %>'><%#XPath("title")%></a></li>
    
</ItemTemplate>
    
<FooterTemplate></ul></FooterTemplate>
    
</asp:Repeater>
    
</div>
    
</form>
</body>
</html>
search.aspx.vb
Public Partial Class searchByStream
    
Inherits System.Web.UI.Page

    
Private Const url As String = "http://msdn.microsoft.com/globalrss/zh-cn/global-MSDN-zh-cn.xml"

    
Protected Sub Page_Load(ByVal sender As ObjectByVal e As System.EventArgs) Handles Me.Load
        
If Not IsPostBack Then
            
If Not String.IsNullOrEmpty(Request.Form("txtQ")) Then
                
Call run()
            
End If
        
End If
    
End Sub


    
Private Sub run()
        rep.DataSource 
= getDataSource
        rep.DataBind()
    
End Sub


    
Public Function getDataSource()
        
Using wc As New System.Net.WebClient
            
With wc
                
Using sr As System.IO.Stream = .OpenRead(url)
                    
Dim doc As New System.Xml.XmlDocument
                    doc.Load(sr)
                    
Dim xpath As String = "/rss/channel/item[contains(title,'" & HttpUtility.HtmlEncode(Request.Form("txtQ")) & "')]"
                    
Return doc.SelectNodes(xpath)
                
End Using
            
End With
        
End Using
    
End Function


    
Private Sub rep_ItemDataBound(ByVal sender As ObjectByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rep.ItemDataBound
        
If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then
            
DirectCast(e.Item.FindControl("msdnItem"), HtmlControls.HtmlContainerControl).InnerHtml = DirectCast(e.Item.FindControl("msdnItem"), HtmlControls.HtmlContainerControl).InnerText.Replace(HttpUtility.HtmlEncode(Request.Form("txtQ")), "<span style=""background-color:yellow"">" & HttpUtility.HtmlEncode(Request.Form("txtQ")) & "</span>")
        
End If
    
End Sub


End Class