📄 100165643.htm
字号:
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create new name element</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlElement newFTEL=doc.CreateElement("name");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> newName.InnerText="C. Monster";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> newAuthor.AppendChild(newName);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create new price element</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlElement newPrice=doc.CreateElement("price");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> newPrice.InnerText="9.95";</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> newBook.AppendChild(newPrice);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //add to the current document</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> doc.DocumentElement.AppendChild(newBook);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //write out the doc to disk</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlTextWriter tr=new XmlTextWriter("..\\..\\..\\booksEdit.xml",null);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> tr.Formatting=Formatting.Indented;</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> doc.WriteContentTo(tr);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> tr.Close();</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //load listBox1 with all of the titles, including new one</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlNodeList nodeLst=doc.GetElementsByTagName("title");</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> foreach(XmlNode node in nodeLst)</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> listBox1.Items.Add(node.InnerText);</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">}</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在执行这段代码后,会得到与上一个示例相同的结果,但本例在列表框中添加了一本书:</span><span lang="EN-US">The Case of the Missing Cookie</span><span style="FONT-FAMILY: 宋体">。单击</span><span lang="EN-US">cookie caper</span><span style="FONT-FAMILY: 宋体">标题,会显示与其他标题一样的信息。中断代码,可以看出,这是一个相当简单的过程。首先,创建一个新的</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">元素:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">XmlElement newBook = doc.CreateElement("book");</span></p>
<p class="MsoNormal"><span lang="EN-US">CreateElement()</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">3</span><span style="FONT-FAMILY: 宋体">个重载方法,可以指定:</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">元素名</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">名称和命名空间</span><span lang="EN-US">URI</span></p>
<p class="1" style="MARGIN-LEFT: 37.55pt; FTEL: -16.1pt"><span lang="EN-US">●<span style="FONT: 7pt 'Times New Roman'"> </span></span><span style="FONT-FAMILY: 宋体">前缀、本地名和命名空间</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">创建了该元素后,就要添加属性了:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">newBook.SetAttribute("genre","Mystery");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">newBook.SetAttribute("publicationdate","2001");</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">newBook.SetAttribute("ISBN","123456789");</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">创建了属性后,就要添加书籍的其他元素了:</span></p>
<p class="a6" style="MARGIN-TOP: 8.15pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">XmlElement newTitle = doc.CreateElement("title");</span></p>
<p class="a6" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US">newTitle.InnerText = "The Case of the Missing Cookie";</span></p>
<p class="a6" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US">newBook.AppendChild(newTitle);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">再次创建一个新的基于</span><span lang="EN-US">XmlElement</span><span style="FONT-FAMILY: 宋体">的对象</span><span lang="EN-US">(newTitle)</span><span style="FONT-FAMILY: 宋体">,把</span><span lang="EN-US">InnerText</span><span style="FONT-FAMILY: 宋体">属性设置为新书名,把该元素添加为</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">元素的一个子元素。对</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">元素中的其他元素重复这一操作。注意把</span><span lang="EN-US">name</span><span style="FONT-FAMILY: 宋体">元素添加为</span><span lang="EN-US">author</span><span style="FONT-FAMILY: 宋体">元素的一个子元素。这样就可以在其他</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">元素中得到合适的嵌套关系。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">最后把</span><span lang="EN-US">newBook</span><span style="FONT-FAMILY: 宋体">元素添加到</span><span lang="EN-US">doc.DocumentElement</span><span style="FONT-FAMILY: 宋体">节点上,它与其他</span><span lang="EN-US">book</span><span style="FONT-FAMILY: 宋体">元素同级。现在用新元素更新现有的文档。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">最后,把新</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档写到磁盘上。在这个示例中,创建一个新</span><span lang="EN-US">XmlTextWriter</span><span style="FONT-FAMILY: 宋体">,把它传送给</span><span lang="EN-US">WriteContentTo</span><span style="FONT-FAMILY: 宋体">方法。</span><span lang="EN-US">WriteContentTo </span><span style="FONT-FAMILY: 宋体">和</span> <span lang="EN-US">WriteTo</span><span style="FONT-FAMILY: 宋体">方法都带一个</span><span lang="EN-US">XmlTextWriter</span><span style="FONT-FAMILY: 宋体">参数。</span><span lang="EN-US">WriteContentTo</span><span style="FONT-FAMILY: 宋体">把当前节点及其所有的子节点都保存到</span><span lang="EN-US">XmlTextWriter</span><span style="FONT-FAMILY: 宋体">,而</span><span lang="EN-US">WriteTo</span><span style="FONT-FAMILY: 宋体">只保存当前节点。因为</span><span lang="EN-US">doc</span><span style="FONT-FAMILY: 宋体">是一个基于</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">的对象,它表示整个文档,所以应保存它。我们还使用了</span><span lang="EN-US">Save</span><span style="FONT-FAMILY: 宋体">方法,它总是保存整个文档,</span><span lang="EN-US">Save</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN-US">4</span><span style="FONT-FAMILY: 宋体">个重载方法,其参数分别是一个包含文件名和路径的字符串、基于</span><span lang="EN-US">Stream</span><span style="FONT-FAMILY: 宋体">的对象、基于</span><span lang="EN-US">TextWriter</span><span style="FONT-FAMILY: 宋体">的对象和基于</span><span lang="EN-US">XmlWriter</span><span style="FONT-FAMILY: 宋体">的对象。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">我们还在</span><span lang="EN-US">XmlTextWriter</span><span style="FONT-FAMILY: 宋体">上调用了</span><span lang="EN-US">Close()</span><span style="FONT-FAMILY: 宋体">方法,刷新内部缓存,并关闭文件。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">在运行这个示例时,会得到如图</span><span lang="EN-US">23-6</span><span style="FONT-FAMILY: 宋体">所示的屏幕图。注意列表框底部的新项。</span></p>
<p align="center"><em><span lang="EN-US"><img height="187" src="23/image006.jpg" width="172" border="0" alt="" /></span></em></p>
<p style="FTEL: 8.15pt" align="center"><span style="FONT-FAMILY: 宋体">图</span><span lang="EN-US"> 23-6</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">如果要从头开始创建一个文档,可以使用</span><span lang="EN-US">XmlTextWriter(</span><span style="FONT-FAMILY: 宋体">见本章前面的介绍</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">。还可以使用</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">。使用哪个比较好?如果要写入</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">流的数据已经准备好,最好选择</span><span lang="EN-US">XmlTextWriter</span><span style="FONT-FAMILY: 宋体">类。但是,如果需要一次建立</span><span lang="EN-US">XML</span><span style="FONT-FAMILY: 宋体">文档的一小部分,在不同的地方插入节点,用</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">创建文档就比较好。为此,可以把下面的代码:</span></p>
<p class="a6" style="MARGIN-TOP: 4.9pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> doc.Load("..\\..\\..\\books.xml");</span></p>
<p class="MsoNormal" style="FTEL: 0cm"><span style="FONT-FAMILY: 宋体">改为</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">这些代码在示例</span><span lang="EN-US">DOMSample4</span><span style="FONT-FAMILY: 宋体">中</span><span lang="EN-US">)</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 4.9pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> //create the declaration section</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlDeclaration newDec = doc.CreateXmlDeclaration("1.0",null,null);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> doc.AppendChild(newDec);</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> //create the new root element</span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> XmlElement newRoot = doc.CreateElement("newBookstore");</span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"> doc.AppendChild(newRoot);</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">首先创建一个新</span><span lang="EN-US">XmlDeclaration</span><span style="FONT-FAMILY: 宋体">,其参数是版本</span><span lang="EN-US">(</span><span style="FONT-FAMILY: 宋体">目前是</span><span lang="EN-US">"1.0")</span><span style="FONT-FAMILY: 宋体">、编码</span><span lang="EN-US">(edcoding)</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">standalone</span><span style="FONT-FAMILY: 宋体">标志。如果没有使用</span><span lang="EN-US">null</span><span style="FONT-FAMILY: 宋体">,编码参数应设置为一个字符串,该字符串应是</span><span lang="EN-US">System.Text.Encoding</span><span style="FONT-FAMILY: 宋体">类的一部分。</span><span lang="EN-US">null</span><span style="FONT-FAMILY: 宋体">默认为</span><span lang="EN-US">UTF-8</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US">standalone</span><span style="FONT-FAMILY: 宋体">标志可以是</span><span lang="EN-US">yes</span><span style="FONT-FAMILY: 宋体">、</span><span lang="EN-US">no</span><span style="FONT-FAMILY: 宋体">或</span><span lang="EN-US">null</span><span style="FONT-FAMILY: 宋体">,但如果是</span><span lang="EN-US">null</span><span style="FONT-FAMILY: 宋体">,就不使用该属性,也不包含在文档中。</span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">要创建的下一个元素是</span><span lang="EN-US">DocumentElement</span><span style="FONT-FAMILY: 宋体">。在本例中,它称为</span><span lang="EN-US">newBookstore</span><span style="FONT-FAMILY: 宋体">,这样区别就比较明显。代码的其余部分与前面的示例相同,执行的方式也相同。下面是从代码中生成的</span><span lang="EN-US">booksEdit.xml</span><span style="FONT-FAMILY: 宋体">:</span></p>
<p class="2" style="MARGIN-TOP: 4.9pt; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"><?xml version="1.0"?></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"><newBookstore></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <book genre="Mystery" publicationdate="2001" ISBN="123456789"></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <title>The Case of the Missing Cookie</title></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <author></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <name>C. Monster</name></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </author></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> <price>9.95</price></span></p>
<p class="2" style="MARGIN-LEFT: 21.45pt; FTEL: 18.45pt"><span lang="EN-US"> </book></span></p>
<p class="2" style="MARGIN-TOP: 0cm; MARGIN-LEFT: 21.45pt; MARGIN-RIGHT: 0cm; FTEL: 18.45pt"><span lang="EN-US"></newBookstore></span></p>
<p class="MsoNormal"><span style="FONT-FAMILY: 宋体">本章没有介绍</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">类的每个细节,也没有介绍在</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">中对创建</span><span lang="EN-US">DOM</span><span style="FONT-FAMILY: 宋体">模型有帮助的其他类。但是,我们说明了</span><span lang="EN-US">.NET</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN-US">DOM</span><span style="FONT-FAMILY: 宋体">有多么灵活和强大。在希望随机访问文档时,可以使用</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">类。在希望有一个流类型的模型时,可以使用基于</span><span lang="EN-US">XmlReader</span><span style="FONT-FAMILY: 宋体">的类。基于</span><span lang="EN-US">XmlDocument</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US">XmlNode</span><span style="FONT-FAMILY: 宋体">的灵活性要求的内存比较多,读取文档的性能也没有使用</span><span lang="EN-US">XmlReader</span><span style="FONT-FAMILY: 宋体">好,所以应仔细考虑在这种情况下最好使用什么方法。</span></p></div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165642.htm">上一页</a> <a href="index.html">首页</a> <a href="100165644.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165643.htm'><font color='red'>23.6 在.NET中使用DOM</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165640.htm'>23.5.1 使用 XmlTextReader类</a></div><div style='float:right;width:49%'>·<a href='100165641.htm'>23.5.2 使用XmlValidatingReader类</a></div><div style='float:left;width:49%'>·<a href='100165642.htm'>23.5.3 使用XmlTextWriter类</a></div><div style='float:right;width:49%'>·<a href='100165644.htm'>23.7 在NET中使用XPath和XSLT</a></div><div style='float:left;width:49%'>·<a href='100165645.htm'>23.7.1 System.Xml.XPath命名空间</a></div><div style='float:right;width:49%'>·<a href='100165646.htm'>23.7.2 System.Xml.Xsl命名空间</a></div></div>
</div>
</div>
</div>
<!-- 评论 -->
<!-- 今日推荐 -->
</div>
<!-- 页脚 -->
<div id="foot">
<img src="../../book/readbook.aspx@node=5643&bookid=16&bookname=23.6++_25d4_25da.NET_25d6_25d0_25ca_25b9_25d3_25c3DOM" alt="" width="0" height="0" />
<style>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -