如果用Microsoft最新的分析器(目前是MSXML 4.0)开发大量的代码,会怎么样?如果要在.NET中使用它们,您会从头开始编写吗?使用MSXML 4.0 DOM对象模型会简单一些吗?您会立即转而使用.NET吗?
当然不会。XML 4.0、3.0和2.0可直接在应用程序中使用。在解决方案中添加一个MSXML4.DLL引用,就可以开始编写代码。
下面几个示例将使用books.xml作为数据源。books.xml可以从Wrox网站(http://www.wrox.com/)上下载,它也包含在.NET SDK的几个示例中。books.xml文件是图像书店的书目清单,包含类型、作者姓名、价格和ISDN号码等信息。本章中的所有代码示例也可以在Wrox网站上得到。要运行这些示例,XML数据文件必须在如下所示的路径结构中:
/XMLChapter/Sample1
/XMLChapter/Sample2
/XMLChapter/Sample3
...
可以调用所需要的目录,但相对位置是非常重要的。也可以修改示例,使之指向需要的地址。示例代码中的注释说明了应修改哪些代码行。
下面是books.xml文件:
<?xml version='1.0'?>
<!-- This file represents a fragment of a book store inventory database -->
<bookstore>
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-23-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
上面的一些代码使用MSXML 4.0从books.xml中加载一个带有ISDN的列表框。完整的代码可以从下载的MSXML_Sample文件夹中找到,可以把它们复制到Visual Studio IDE中,或者从头开始新建一个Windows窗体,该窗体包含一个列表框和一个按钮,它们都使用listBox1和button1的默认名称,button1的Text属性设置为Load XML。
注意,因为MSXML 4是一个基于COM的组件,所以需要创建交互操作的程序集。最简单的方式是在Visual Studio IDE的Project菜单中选择Add Reference,进入COM选项卡,选择Microsoft XML, v4.0 (或v3.0, v2.6).。可以把MSXML2看做在Solution Explorer中添加的命名空间。为什么是MSXML2?在导入COM组件时,为新程序集提供的命名空间是该COM组件的类型库名。在本例中,它就是MSXML2。如果使用TLBIMP,就可以把命名空间改为其他名称。
下面看看MSXML_sample示例代码中最重要的代码行。
因为已经有了引用,所以添加如下代码:
using MSXML2;
还需要一个类级的变量:
private DOMDocument40 doc;
现在准备在应用程序中使用MSXML。
我们要从列表框中获取ISBN,使用一个简单的XPath搜索,就可以知道匹配的书籍节点,在消息框中显示该节点的文本(书名和价格)。XML Path Language (XPath)是一种XML记号,可以用于查询和过滤XML文档中的文本。本章的后面介绍如何在.NET中使用XPath。
下面是在列表框中选择条目的事件处理程序代码:
protected void listBox1_SelectedIndexChanged (
object sender, System.EventArgs e)
{
string srch=listBox1.SelectedItem.ToString();
IXMLDOMNode nd=doc.selectSingleNode(
"bookstore/book[@ISBN='" + srch + "']");
MessageBox.Show(nd.text);
}
下面编写单击按钮的事件处理程序。首先,加载books.xml文件,注意,如果没有在bin/debug或 bin/release文件夹中运行可执行文件,就需要适当地调整路径:
protected void button1_Click (object sender, System.EventArgs e)
{
doc=new DOMDocument40 ();
doc.load("..\\..\\..\\books.xml");
下面的代码声明nodes是书籍节点的一个节点列表,在本例中有3个书籍节点:
nodes = doc.selectNodes("bookstore/book");
IXMLDOMNode node=nodes.nextNode();
迭代这些节点,把ISBN属性的文本值添加到listBox1中:
while(node!=null)
{
listBox1.Items.Add(node.attributes.getNamedItem("ISBN").text);
node=nodes.nextNode ();
}
}
图23-1是执行该示例后所得到的屏幕图,单击按钮,把数据加载到列表框中。然后选择列表框中的一项。