哪里有VB7中关于System.XML详细说明(MSDN除外,最好是中文的)

mwenyuan 2001-09-07 12:50:08
...全文
117 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
mwenyuan 2001-09-07
  • 打赏
  • 举报
回复
多谢斑竹,除了CSharp的源码是否有VB.net的示例代码?
acptvb 2001-09-07
  • 打赏
  • 举报
回复
探索System.Xml Assembly

以System.Xml类揭示XML的强大能力

众所周知,Microsoft的.NET平台提供了卓越的端到端的XML支持。Microsoft在开发.NET时就加入了这种支持,而不是在最后加入的,所以XML是完全融入到了平台之中。因此,程序员在开发时有了无可比拟的灵活性和强大力量。System.Xml assembly包含了大部分与XML相关的类并封装了.NET中大部分XML功能。

在本文中,将浏览System.Xml assembly中的许多类,并学习应在何时,怎样使用这些类,特别是DocumentNavigator, XmlAttribute, XmlDocument, XmlElement, XmlNode, XmlNamedNodeMap, XmlNodeList, XmlTextReader, 和XmlTextWriter这些类。当你理解了这些类的功能后,会发现它们很容易使用。

在你学习System.Xml assembly之前,先学习其他处理XML数据的方法。一种方法是文档对象模型(DOM),它创建一棵树来表示XML文档,并将它载入内存。你可以遍历树结构,以任意方向访问节点。请看图一中表示XML文档的DOM。

图一 DOM 模型

当你用DOM来解析XML文当时,DOM将文档中的节点放入内存中的树结构中。
<?xml version="1.0"?>
<golfer>
<name>Dan Wahlin</name>
<courses>
<course>
Pinetop Lakes CC
</course>
<course>Ocotillo</course>
</courses>
</golfer>

使用DOM你可以对节点方便的进行选择、插入、更新或删除操作,但这种灵活性是有代价的。你必须将文档中所有的信息都载入内存,包括Element、Attribute、Text等,并将它们与节点相关联。例如,图一中你将“Ocotillo”同DOM中一个text节点关联。当你想要从很大的文档中抽取数据时,这种表示XML文档的方式会耗用很多内存。

你可以运用一些技术来克服DOM中处理大文件的问题。一种技术是Simple API for XML(SAX),它采用单向的遍历方式。David Megginson从W3C xml-dev邮件列表成员们得到很大帮助,开发出SAX。当找到不同的节点时,会触发事件。处理不同种类节点的内容处理器会捕捉到这些事件。这种方法是高效、快捷的,它代表了push模式,但是当你在解析过程中要记录状态信息时,事情会变得复杂。

而.NET平台引入了拉的模式来解析XML文档,与SAX的Push模式正好相反。这可以做到进行快速高效的单向遍历,并且无需缓存。想了解为什么.NET不支持SAX,请看“Diving Into the Unknown”。

现在你对DOM,Push模式和Pull模式有了些了解,并知道Pull模式的一些优点。下一步,就可以来看一下System.Xml assembly如何把中的类,它们如何把XML文档中的节点“拉”到客户端应用程序。

用XmlTextReader和XmlTextWriter来实现Pull

Microsoft在System.Xml assembly中提供了XmlTextReader和XmlTextWriter类。它们分别继承XmlReader和XmlWriter两个抽象类。这两个类都是单项、无需缓存的方式处理的。与DOM不同,XmlTextReader不是将整个文档都载入内存,而是每次只拉一个节点。XmlTextReader是一个流,并提供了当前节点的访问。这样一个单向的流意味着当XmlTextReader从出发刻从出发刻从文档根节点出发,任意时刻都只有一个节点在内存之中。当到达子节点时,XmlTextReader已经解析过它的祖先节点了,但祖先节点都不会在内存中。在这点上,不能回溯到祖先节点。

这种功能使得你可以依次查看并处理各个节点而不是将它们全部加载到内存之中。这就提供了耗用低内存来处理大型XML文档的能力。你可以看到XmlTextReader是如何遍历XML文档的(见列表1)。

<%@ Import Namespace="System.Xml" %>
<script language="C#" runat=server>
public class ReadXmlFile {
StringBuilder output = new StringBuilder();
public string ReadDoc(String doc)
{
String m_Document = doc;
XmlTextReader xmlReader = null;
try {
xmlReader = new XmlTextReader(m_Document);
WriteXml(xmlReader);
}
catch (Exception e) {
output.Append("Error Occured While Reading " + m_Document + " " + e.ToString());
}

finally {
if (xmlReader != null)
xmlReader.Close();
}
return output.ToString();
}

private void WriteXml(XmlTextReader xmlReader) {

while (xmlReader.Read()) {
if (xmlReader.NodeType == XmlNodeType.Element) {
output.Append(indent(xmlReader.Depth*4));
output.Append("<b><" + xmlReader.Name + "</b>");
if (xmlReader.AttributeCount > 0) {
while (xmlReader.MoveToNextAttribute()) {
output.Append(" <i>" +
xmlReader.LocalName +
"=\"" + xmlReader.Value +
"\"</i> ");
}
}
if (xmlReader.IsEmptyTag) {
output.Append("<b>/></b><br>");
} else {
output.Append("<b>></b><br>");
}
} else if (xmlReader.NodeType == XmlNodeType.EndTag) {
output.Append(indent(xmlReader.Depth*4));
output.Append("<b></" + xmlReader.Name + "></b><br>");
} else if (xmlReader.NodeType == XmlNodeType.Text) {
if (xmlReader.Value.Length != 0) {
output.Append(indent(xmlReader.Depth*4));
output.Append("<font color=#ff0000>" + xmlReader.Value + "<br></font>");
}
}
}

}
private string indent(int number) {
string spaces = "";
for (int i=0; i < number; i++) {
spaces += " ";
}
return spaces;
}
} //End Class

private void Page_Load(Object sender, EventArgs e) {
ReadXmlFile readXmlFileSample = new ReadXmlFile();
output.InnerHtml =
readXmlFileSample.ReadDoc(Server.MapPath("golfers.xml"));
}
</script>
<html>
<head>
</head>
<body>
<font size="5" color="#02027a">Working with the XmlTextReader Class</font><p>
<div id="output" runat="server"/>
</body>
</html>

列表一XmlTextReader 类提供了快速,单向的XML文档访问方式

XmlTextReader类中读入一个XML文档先调用ReadDoc()方法:
public string ReadDoc(String doc) {
XmlTextReader xmlReader = null;
try {
xmlReader = new XmlTextReader(doc);
WriteXml(xmlReader);
}
catch (Exception e){
output.Append("Error Occurred While Reading " +
doc + " " + e.ToString());
}
finally {
if (xmlReader != null)
xmlReader.Close();
}
return output.ToString();
}

一旦ReadDoc()方法实例化XmlTextReader类并载入文档后,就调用WriteXml()方法,并将XmlTextReader对象作为参数传给它。WalkXml()方法使得XmlTextReader以单向的方式遍历整个XML文档,并将找到的不同的节点写入叫output的aStringBuilder对象。一旦ReadDoc()方法到达了XML文档的末尾,它就将信息写到output中给浏览器。在文章中,你还会看到怎样使用XmlTextReader验证XML文档。

用类似游标去你可以使用XmlTextReader类来读XML文档,用类似游标去XmlTextWriter类用类似单向游标的方式去写XML文件。我不会在此列出它的所有属性和方法,但当你看到一个例子后,就会发现它很容易使用。要使用XmlTextWriter,将你想要写的XML文档和需要的编码类型传给类的构造函数(其他重载的构造函数能够处理流)。

XmlTextWriter writer = new XmlTextWriter(xmlDocPath,Encoding.UTF8);

一旦XmlTextWriter对象实例化,你可以通过将WriterStartDocumentAttribute设为true来加入XML声明。之后,你可以通过XmlTextWriter的方法写入Element、Attribute和其他类型的节点。写入一个Element节点只需要调用WriterElement()方法,传入Element名,名字空间前缀,如果需要。

writer.WriteStartElement("golfer", null);

请看列表二中的例子,
<%@ Import Namespace="System.Xml" %>

<script language="C#" runat="server">
public void Page_Load(Object Src, EventArgs E) {
string xmlDoc = Server.MapPath("xmltextwriter.xml");
XmlTextWriter writer = null;
try {
writer = new XmlTextWriter(xmlDoc,Encoding.UTF8);
writer.Formatting = Formatting.Indented;
writer.WriteStartDocument(true);
writer.WriteComment("XML Nodes added using the XmlTextWriter");
writer.WriteStartElement("golfers");
writer.WriteAttribute("xmlns","x-schema:golfers.xdr");
writer.WriteStartElement("golfer", null);
writer.WriteAttribute("skill",
"moderate");
writer.WriteAttribute("handicap",
"12");
writer.WriteAttribute("clubs","Taylor Made");
writer.WriteAttribute("id","1111");
writer.WriteElementString(
"firstName",null,"Paul");
writer.WriteElementString(
"lastName",null,"Allsing");
writer.WriteStartElement(
"favoriteCourses", null);
writer.WriteStartElement(
"course",null);
writer.WriteAttribute("city",
"Phoenix");
writer.WriteAttribute("state",
"Arizona");
writer.WriteAttribute("name",
"Ocotillo");
writer.WriteEndElement();
writer.WriteStartElement("course",
null);
writer.WriteAttribute("city",
"Tempe");
writer.WriteAttribute("state",
"Arizona");
writer.WriteAttribute("name","Ken McDonald");
writer.WriteEndElement();
writer.WriteStartElement("course",
null);
writer.WriteAttribute("city",
"Phoenix");
writer.WriteAttribute("state",
"Arizona");
writer.WriteAttribute("name",
"Ahwatukee CC");
writer.WriteEndElement();
writer.WriteEndElement(); //favoriteCourses
writer.WriteEndElement(); //golfer
writer.WriteEndElement(); //golfers
writer.Flush();
writer.Close();
XmlDocument doc = new XmlDocument();
doc.Load(xmlDoc);
Response.ContentType = "text/xml";
doc.Save(Response.Output);
}
catch (Exception e) {
Response.Write(e.ToString());
}
finally {
if (writer != null) {
writer.Close();
}
}

}
</script>

列表二XmlTextWriter 可以高效快速的生成XML 文档,而无需将 DOM 结构驻留内存。
它使用XmlTextWriter来创建一个包含一些Element和Attribute的XML文档。看过代码后,你会发现调用WriteStartElement()和WriteAttribute()等方法可以方便的实现将XML写入流,文件或其他输出源。

创建和插入节点

XmlDocument类是针对整个XML文档的,而不是单个的节点。它能够在DOM中创建,插入和删除节点。当你想要创建另一个子Element或Attribute时,这会很方便。XmlDocument类能够创建许多种类的节点:element, attribute, comment, processing instruction, CDATA section, node, text nodes, empty document fragment, entity reference。

用XmlDocument创建不同的节点需要实例化,载入XML文档,调用相应的创建方法,然后调用相应的方法在DOM中增加新节点。你可以使用其他的方法,如PrependChild()。在列表三中是将一个XML字符串载入到DOM中并增加两个空Element testB和testC的例子。

<%@ Import Namespace="System.Xml" %>
<script language="C#" runat="Server">
void Page_Load(object sender, EventArgs e) {
String sXML = "<?xml version=\"1.0\"?><root><testA>";
sXML += "<testChild>Testing!</testChild></testA></root>";
XmlDocument oDocument = new XmlDocument();
oDocument.LoadXml(sXML);
XmlNode oRoot = oDocument.DocumentElement;
try {
XmlNode oElement1 = oDocument.CreateElement("testB");
XmlNode oElement2 = oDocument.CreateElement("testC");

oRoot.AppendChild(oElement1);
oRoot.AppendChild(oElement2);
}
catch(Exception exc) {
Response.Write(exc.ToString());
}
Response.ContentType ="text/xml";
oDocument.Save(Response.Output);
}
</script>

列表三 通过XmlDocument类,能够对XML文档进行添加、删除和修改

请用一下代码创建XmlDocument对象并载入字符串:
String sXML = "<?xml version=\"1.0\"?><root><testA>";
sXML += "<testChild>Testing!</testChild></testA></root>";
XmlDocument oDocument = new XmlDocument();
oDocument.LoadXml(sXML);

这段代码创建了节点并加入到文档的根节点,创建的XML文档如下:
<?xml version="1.0"?>
<root>
<testA>
<testChild>Testing!</testChild>
</testA>
<testB/>
<testC/>
</root>

以用XmlDocument以类加入节点就如以下代码一般简单:
XmlNode oRoot = oDocument.DocumentElement;
try {
XmlNode oElement1 = oDocument.CreateElement("testB");
XmlNode oElement2 = oDocument.CreateElement("testC");

oRoot.AppendChild(oElement1);
oRoot.AppendChild(oElement2);
}
catch(Exception exc) {
Response.Write(exc.ToString());
}

一旦你将XML文档载入DOM中,你可以使用很多类来访问节点和进行其他操作。如果XML对你来说比较新,那么你会比较容易理解XmlAttribute,XmlElement,和XmlNode类,而对XmlNodeList和XmlNamedNodeMap类就不太熟悉了。

属性属性XmlNodeList类代表节点集,而XmlNamedNodeMap代表的是属性属性集。当你要枚举与某一节点相关的子节点或属性时,这些类会很有用。

你可以在本文的代码例中找到叫UsingSystemXML.aspx文件(下载代码).,其中会有使用这些类的方法。它在XML文档中递归遍历,重新创建一个格式化的HTML文档,并输出到浏览器。代码还显示了如何使用XmlTextReader类来验证这是一个XML文档而不是文档类型定义(DTD)。你可以通过ValidationAttribute和ValidationEventHandler事件来处理。

实例化一个对象

如果你用过MSXML3,你可能会熟悉DOMDocument方法如selectSingleNode()和selectNodes()等。这些方法可以通过XPath(一种XML的查询语言)语句来访问XML文档中某一个节点。在.NET平台中,用DocumentNavigator类来浏览载入DOM中的XML文档。这个类用游标方式来读写XML和浏览文档。要实例化一个DocumentNavigator对象,可用以下代码:

XmlDocument doc = new XmlDocument();
XmlDocument.Load(Server.MapPath("golfers.xml"));
DocumentNavigator nav = new DocumentNavigator(doc);

之后,你就可以用DocumentNavigator对象和XPath来选择节点了。

nav.MoveToDocument();
nav.SelectSingle("//golfer");

一旦DocumentNavigator对象找到了相应的节点,它就能进行分析处理了。以下代码显示怎样处理golfer节点的属性的。

if (nav.HasAttributes) {
for (int i=0;i<nav.AttributeCount;i++) {
nav.PushPosition(); //Save current position on golfer node
nav.MoveToAttribute(i);
//Process the attribute as appropriate
nav.PopPosition(); //Return to last saved
}
}

虽然在本文中没有覆盖所有System.Xml assembly中的类,示例给你提供了快速学习在.NET应用程序中运用XML的方法。想要看这些类在实际应用中的使用,请参见资源列表中的文章。这篇文章提供了很好的实例,它运用了System.Xml assembly中的一些类来构建基于XML的应用程序。

-微软亚洲技术中心 VB开发支持

本贴子仅供CSDN的用户作为参考信息使用。其内容不具备任何法律保障。您需要考虑到并承担使用此信息可能带来的风险。具体事项可参见使用条款 (http://www.csdn.net/microsoft/terms.shtm)。

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧