NET Framework 中的 XML 設(shè)計目標(biāo)_第1頁
NET Framework 中的 XML 設(shè)計目標(biāo)_第2頁
NET Framework 中的 XML 設(shè)計目標(biāo)_第3頁
NET Framework 中的 XML 設(shè)計目標(biāo)_第4頁
NET Framework 中的 XML 設(shè)計目標(biāo)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

使用.NETFramework中的XML(DOM)[日期:2007-08-01]來源:作者:[字體:大中?。?NETFramework中的XML類提供全面、集成的類集,使您得以使用XML文檔和數(shù)據(jù)。.NETFramework中的XML類可以分為幾組:用XmlReader和XmlWriter分析和編寫XML,用XmlValidatingReader驗證XML,和用XmlDocument編輯XML文檔。XslTransform、XmlSchema和XPathNavigator類支持執(zhí)行XSL轉(zhuǎn)換(XSLT)、編輯XML架構(gòu)定義語言(XSD)架構(gòu)和應(yīng)用XPath查詢。.NETFramework中的XML設(shè)計目標(biāo).NETFramework中的XML目標(biāo)是:?符合W3C標(biāo)準(zhǔn)。?擴展性。?可插接式結(jié)構(gòu)。?性能。?與ADO.NET緊密集成。符合標(biāo)準(zhǔn)符合標(biāo)準(zhǔn)意味著類完全符合XML、命名空間、XSLT、XPath、架構(gòu)和文檔對象模型(DOM)的當(dāng)前W3C建議標(biāo)準(zhǔn)。符合標(biāo)準(zhǔn)確保了互操作性并使跨平臺應(yīng)用程序開發(fā)變得容易。最顯著的一點是,.NETFramework中的XML類支持W3CXML架構(gòu)定義語言(XSD)1.0建議。.NETFramework中有一些XML類提供驗證,還有一個對象模型可用于在內(nèi)存中生成XSD架構(gòu)??舍槍軜?gòu)、DTD、XDR和XSD進行驗證的快速只進分析器稱為XmlValidatingReader。XmlValidatingReader是符合標(biāo)準(zhǔn)的XML分析器。XmlSchemaCollection類可用于在使用XmlValidatingReader時緩存常用的XSD或XDR架構(gòu)。.NETFramework中有一個XML類集提供架構(gòu)對象模型(SOM),使用該模型可以以編程方式生成和編譯XSD架構(gòu)。XmlSchema類表示XSD架構(gòu)。使用XmlReader和XmlWriter類可以加載和保持這些架構(gòu)。XMLDocument類實現(xiàn)文檔對象模型級別1和級別2建議,它是根據(jù).NETFramework的通用設(shè)計指南定制的。例如,方法名稱使用大寫字母。XslTransform類符合用于使用XSLT轉(zhuǎn)換文檔的XSL轉(zhuǎn)換(XSLT)1.0版建議和XML路徑語言(XPath)1.0建議。擴展性.NETFramework中的XML通過使用抽象基類和虛方法而變得可擴展。這種擴展性(或子類創(chuàng)建)由XmlReader、XmlWriter和XPathNavigator抽象類闡釋,這些抽象類是使得能夠在不同的存儲區(qū)或數(shù)據(jù)源上開發(fā)新實現(xiàn)的類和公開XML的類。例如,XPathNavigator是集成了XPath查詢引擎的API,該引擎可在現(xiàn)有存儲區(qū)(如文件系統(tǒng)、注冊表和關(guān)系數(shù)據(jù)庫)上實現(xiàn)。它不僅將數(shù)據(jù)顯示為XML,還使用XPathAPI查詢方法(如Select)的默認(rèn)實現(xiàn),提供對不同數(shù)據(jù)源的XPath查詢支持。擴展性的另一個示例是XMLReader,它提供一個用于對存儲區(qū)進行快速只進分析的API,公開在它移動通過流時所發(fā)現(xiàn)的XMLInfoset。.NETFramework中的XML具有以下XmlReader實現(xiàn):用于讀取流的XmlTextReader類、用于讀取節(jié)點樹的XmlNodeReader類和用于在XmlTextReader上分層驗證支持的XmlValidatingReader。XMLWriter使用基于推送的API生成XML流。.NETFramework中的XML具有一個稱為XmlTextWriter的XmlWriter實現(xiàn)。可以進一步從這些類的實現(xiàn)派生,創(chuàng)建可以實現(xiàn)特定處理的其他讀取器。例如,通過從XMLTextReader派生,創(chuàng)建一個稱為MyXmlTextReader的自定義讀取器,可以創(chuàng)建具有特定于應(yīng)用程序處理需求的邏輯的讀取器版本。XMLResolver抽象類提供XML文檔中引用的外部資源的掛鉤。這使您可以用特定于應(yīng)用程序(如數(shù)據(jù)庫)的方式來緩存資源,或通過從該類派生來解析具有不同協(xié)議的資源。XmlResolver的兩個實現(xiàn)XmlUrlResolver和XmlSecureResolver將解析使用http://、https://和file://協(xié)議的資源??刹褰邮浇Y(jié)構(gòu).NETFramework中的XML具有可插接式結(jié)構(gòu)。在此基于流的結(jié)構(gòu)中,可插接式意味著可以很容易替代.NETFramework中基于這些抽象類的組件??刹褰邮浇Y(jié)構(gòu)還意味著數(shù)據(jù)可以在組件之間以流的形式傳送,以及插入到此流中的新組件可以改變處理。例如,來自XMLWebservices的流可用XmlTextReader分析。可以使用XmlTextReader創(chuàng)建XmlDocument,然后可以使用XmlDocument創(chuàng)建XmlNodeReader。另一個示例是從XMLReader加載DOM(XmlDocument類)并使用XmlWriter保存輸出。通過擴展現(xiàn)有類來創(chuàng)建自己的這些類的實現(xiàn),可以影響XmlDocument類的行為。例如,如果創(chuàng)建了一個稱為MyXmlFileReader的XmlReader實現(xiàn),并且它可以將文件系統(tǒng)公開為XML,則可以從此讀取器加載XmlDocument?;蛘呖梢詮腦mlTextReader繼承,創(chuàng)建一個新的自定義讀取器將以屬性為中心的文檔轉(zhuǎn)換為以元素為中心的文檔,它可以用于加載XmlDocumento這為基于現(xiàn)有類的新類提供了可插接式結(jié)構(gòu)。將組件插接在一起的另一個示例是在轉(zhuǎn)換過程中使用不同的數(shù)據(jù)存儲區(qū)(如XPathDocument和XMLDocument)。這些數(shù)據(jù)存儲區(qū)可用XslTransform類轉(zhuǎn)換,輸出然后可以流入另一個存儲區(qū)或以流的形式從XMLWebservices返回。下圖說明了這一點。使用XslTransform類對數(shù)據(jù)進行流處理通過使用IXPathNavigable接口,實現(xiàn)XPathNavigator的任何存儲區(qū)都可以插入到XslTransform類中以允許對該存儲區(qū)進行XSLT轉(zhuǎn)換。XMLDocument、XPathDocument和XmlDataDocument類具有此能力。然后,來自XslTransform的流式輸出可以發(fā)送到可插接式結(jié)構(gòu)樣式的XmlReader或XmlWriter。性能.NETFramework中的XML類表示低級別XML處理組件,這些組件不僅用作.NETFramework的一部分,還用于將XML集成到應(yīng)用程序中。這些類需要具有極高的性能。.NETFramework中的XML類旨在支持基于流處理的模型,它具有下列特性:?使用XMLReader進行的只進、拉模型分析所用的緩存最小。?使用XMLValidatingReader進行只進驗證。?XPathNavigator的創(chuàng)新游標(biāo)樣式導(dǎo)航,它將節(jié)點創(chuàng)建最小化為單個虛節(jié)點,但仍提供對文檔的隨機訪問。這不需要在內(nèi)存中生成完整的節(jié)點樹,如DOM。?來自XslTransform類的增量流式輸出。XPathDocument是XPath查詢的優(yōu)化只讀存儲區(qū),建議在需要進行XSLT處理的任何時候都使用它。通過使用此存儲區(qū)和XslTransform類,可以實現(xiàn)高性能的XSLT轉(zhuǎn)換。與ADO.NET集成通過XML類和ADO.NET之間的緊密集成,關(guān)系數(shù)據(jù)和XML在.NETFramework中結(jié)合在一起。DataSet組件表示斷開連接的數(shù)據(jù)庫,它能夠使用XMLReader和XmlWriter類讀取和寫入XML、將其內(nèi)部關(guān)系架構(gòu)結(jié)構(gòu)保持為XML架構(gòu)(XSD)以及從XML文檔推測架構(gòu)結(jié)構(gòu)。通過將DataSet與XMLDocument同步,使其中一個所維護的數(shù)據(jù)在適當(dāng)?shù)臅r候在另一個中得到更新,XmlDataDocument確實超出了XML和關(guān)系數(shù)據(jù)領(lǐng)域的邊界。由于XmlDocument能夠存儲半結(jié)構(gòu)化數(shù)據(jù),因此在獲得XML存儲區(qū)的所有功能的同時,DataSet基于它的架構(gòu)提供XML上的關(guān)系視圖。有關(guān).NETFramework如何通過DataSet對象和XMLDataDocument對象啟用對數(shù)據(jù)的關(guān)系和分層表示形式的實時同步訪問的更多信息,請參見關(guān)系數(shù)據(jù)和ADO.NET的XMI集成XML文檔對象模型(DOM)文檔對象模型(DOM)類是XML文檔的內(nèi)存中表示形式。DOM使您能夠以編程方式讀取、操作和修改XML文檔。XmlReader類也讀取XML,但它提供非緩存的只進、只讀訪問。這意味著使用XmlReader無法編輯屬性值或元素內(nèi)容,或無法插入和移除節(jié)點。編輯是DOM的主要功能。XML數(shù)據(jù)在內(nèi)存中表示是常見的結(jié)構(gòu)化方法,盡管實際的XML數(shù)據(jù)在文件中時或從另一個對象傳入時以線性方式存儲。以下是XML數(shù)據(jù)。輸入<?XMLversion=〃1.0〃?><books><book><author>Carson</author><priceformat=〃dollar〃>31.95</price><pubdate>05/01/2001</pubdate></book><pubinfo><publisher>MSPress</publisher><state>WA</state></pubinfo></books>下圖顯示將此XML數(shù)據(jù)讀入DOM結(jié)構(gòu)中時內(nèi)存的構(gòu)造。XML文檔結(jié)構(gòu)在XML文檔結(jié)構(gòu)中,此圖中的每個圓圈表示一個節(jié)點(稱為XmlNode對象)。XmlNode對象是DOM樹中的基本對象。XmlDocument類(它擴展XmlNode)支持用于對整個文檔執(zhí)行操作(例如,將文檔加載到內(nèi)存中或?qū)ML保存到文件)的方法。此外,XmlDocument提供了查看和操作整個XML文檔中的節(jié)點的方法。XmlNode和XmlDocument都具有性能和可用性增強,并具有進行下列操作的方法和屬性:?訪問和修改特定于DOM的節(jié)點,如元素節(jié)點、實體引用節(jié)點等。?除檢索節(jié)點包含的信息(如元素節(jié)點中的文本)外,還檢索全部節(jié)點。注意如果應(yīng)用程序不需要DOM提供的結(jié)構(gòu)或編輯功能,則XMLReader和XmlWriter類提供對XML的非緩存的只進流訪問。有關(guān)更多信息,請參見用XmlReader讀取XML和用XmlWriter編寫XMLNode對象具有一組方法和屬性以及基本和定義完善的特性。其中的某些特性包括:?節(jié)點有單個父節(jié)點,父節(jié)點是節(jié)點的上一級節(jié)點。唯一沒有父級的節(jié)點是文檔根,因為它是頂級節(jié)點,包含了文檔本身和文檔片段。?大多數(shù)節(jié)點可以有多個子節(jié)點,子節(jié)點是節(jié)點的下一級節(jié)點。以下是可以有子節(jié)點的節(jié)點類型列表。DocumentDocumentFragmentEntityReferenceElementAttributeXMLDeclaration、Notation>Entity、CDATASection、Text、Comment、ProcessingInstruction和DocumentType節(jié)點沒有子級。?處于同一級別、在關(guān)系圖中由book和pubinfo節(jié)點表示的節(jié)點是同輩。DOM的一個特性是它處理屬性的方式。屬性是不屬于父子關(guān)系和同輩關(guān)系的節(jié)點。屬性被視為元素節(jié)點的屬性,由名稱和值對組成。例如,如果存在由與元素price關(guān)聯(lián)的format=〃dollar”組成的xML數(shù)據(jù),則單詞format是名稱,format屬性的值是dolla匚為檢索price節(jié)點的format=〃dollar〃屬性,可以在游標(biāo)位于price元素節(jié)點時調(diào)用GetAttribute。有關(guān)更多信息,請參見訪問DOM中的屬性將XML讀入內(nèi)存時會創(chuàng)建節(jié)點。然而,并非所有節(jié)點都是同一類型。XML中的元素具有不同于處理指令的規(guī)則和語法。因此,在讀取各種數(shù)據(jù)時,將向每個節(jié)點分配一種節(jié)點類型。此節(jié)點類型確定節(jié)點的特性和功能。有關(guān)在內(nèi)存中生成的節(jié)點類型的更多信息,請參見XML節(jié)點類型。有關(guān)在節(jié)點樹中創(chuàng)建的對象的更多信息,請參見將對象層次結(jié)構(gòu)映射到XML數(shù)據(jù)Microsoft擴展了W3CDOM級別1和級別2中可用的API,使XML文檔的使用更容易。在完全支持W3C標(biāo)準(zhǔn)的同時,附加的類、方法和屬性增加了使用W3CXMLDOM可以完成的功能以外的功能。新類使您能夠訪問關(guān)系數(shù)據(jù),為您提供與ADO.NET數(shù)據(jù)同步、同時將數(shù)據(jù)作為XML公開的方法。有關(guān)更多信息,請參見使DataSet與XmlDataDocument同步DOM對于將XML數(shù)據(jù)讀入內(nèi)存以更改其結(jié)構(gòu)、添加或移除節(jié)點,或者與元素包含的文本一樣修改節(jié)點所保存的數(shù)據(jù)最有用。不過,在其他方案中,還有其他比DOM更快的類。對于對XML的快速非緩存只進流訪問,請使用XmlReader和XmlWriter。如果需要用游標(biāo)模型和XPath進行隨機訪問,請使用XPathNavigator類。XML節(jié)點類型

當(dāng)將XML文檔作為節(jié)點樹讀入內(nèi)存時,這些節(jié)點的節(jié)點類型在創(chuàng)建這些節(jié)點時確定。XMLDOM具有多種節(jié)點類型,這些類型由W3C確定并在1.1.1節(jié)“DOM結(jié)構(gòu)模型”中列出。下表列出了節(jié)點類型、分配給該節(jié)點類型的對象以及每種節(jié)點類型的簡短說明。DOM節(jié)點類型對象說明DocumentXMLDocument類樹中所有節(jié)點的容器。它也稱作文檔根,文檔根并非總是與根元素相同。DocumentFragmentXmlDocumentFragment類包含一個或多個不帶任何樹結(jié)構(gòu)的節(jié)點的臨時袋。DocumentTypeXmlDocumentType類表示<!DOCTYPE...>節(jié)點。EntityReferenceXmlEntityReference類表示非擴展的實體引用文本。ElementXmlElement類表示元素節(jié)點。AttrXmlAttribute類為元素的屬性。ProcessingInstructionXmlProcessingInstruction類為處理指令節(jié)點。CommentXmlComment類注釋節(jié)點。TextXmlText類屬于某個元素或?qū)傩缘奈谋?。CDATASectionXmlCDataSection類表示CDATA。EntityXmlEntity類表示XML文檔(來自內(nèi)部文檔類型定義(DTD)子集或來自外部DTD和參數(shù)實體)中的<!ENTITY...>聲明。NotationXmlNotation類表示DTD中聲明的表示法。盡管屬性(attr在W3CDOM級別1的1.2節(jié)“FundamentalInterfaces'^基本接口)中作為節(jié)點列出,但不能將其視為任何元素節(jié)點的子級。下表顯示了W3C未定義的附加節(jié)點類型,但它們可作為XMLNodeType枚舉在.NET對象模型中使用。因此,這些節(jié)點類型不存在匹配的DOM節(jié)點類型列。節(jié)點類型說明XMLDecla.ra.tion表示聲明節(jié)點<?xmlversion=〃1.0〃...>。XmlSignificantWhitespace表示有效空白(混合內(nèi)容中的空白)。XmlWhitespace表示元素內(nèi)容中的空白。EndElement當(dāng)XmlReader到達元素的末尾時返回。示例XML:</item>有關(guān)更多信息,請參見XMLNodeType枚舉EndEntity由于調(diào)用ResolveEntity而在XMLReader到達實體替換的末尾時返回。有關(guān)更多信息,請參見Xm?o

deType枚舉若要查看讀入XML并對代碼類型使用case構(gòu)造以打印有關(guān)節(jié)點及其內(nèi)容的信息的代碼示例,請參見XmlSignificantWhitespace.NodeType屬性有關(guān)節(jié)點類型及其等效對象名的對象層次結(jié)構(gòu)的更多信息,請參見XML文檔對象模型(DOM)層次結(jié)構(gòu)有關(guān)在節(jié)點樹中創(chuàng)建的對象的更多信息,請參見將對象,層次結(jié)構(gòu)映射到XMI數(shù)據(jù)將對象層次結(jié)構(gòu)映射到XML數(shù)據(jù)當(dāng)XML文檔在內(nèi)存中時,概念上的表示形式是樹。編程時可使用對象層次結(jié)構(gòu)訪問樹節(jié)點。下面的示例顯示XML內(nèi)容如何成為節(jié)點。EndEntity當(dāng)將XML讀入DOM中時,各片段被翻譯為節(jié)點,這些節(jié)點保留有關(guān)自身的附加元數(shù)據(jù),如它們的節(jié)點類型和值。節(jié)點類型是節(jié)點的對象,它確定可執(zhí)行的操作以及可設(shè)置或檢索的屬性。如果具有下面的簡單XML輸入<book><title>TheHandmaid'sTale</title></book>輸入在內(nèi)存中表示為具有分配的節(jié)點類型屬性的下列節(jié)點樹:Book和title節(jié)點樹表示形式XmlElement節(jié)點類型XmlElement節(jié)點類型book元素成為XMLElement對象,下一個元素title也成為XmlElement,而元素內(nèi)容成為XmlTheHandmaid's"RileXmiT$xt節(jié)點類型Text對象。查看XmlElement的方法和屬性可以得知,這些方法和屬性不同于TheHandmaid's"RileXmiT$xt節(jié)點類型下面的示例讀入XML數(shù)據(jù)并根據(jù)節(jié)點類型寫出不同的文本。將下面的XML數(shù)據(jù)文件items.xml用作輸入:輸入<?XMLversion=〃1.0〃?><!--ThisisasampleXMLdocument--><!DOCTYPEItems[<!ENTITYnumber〃123〃>]><Items><Item>Testwithanentity:&number;</Item><Item>testwithachildelement<more/>stuff</Item><Item>testwithaCDATAsection<![CDATA[<456>]]>def</Item><Item>Testwithacharentity:A</Item><!--Fourteencharsinthiselement.--><Item>1234567890ABCD</Item></Items>下面的代碼示例讀取items.XML文件并顯示每個節(jié)點類型的信息。[VisualBasic]ImportsSystemImportsSystem.IOImportsSystem.XMLPublicClassSamplePrivateConstfilenameAsString="items.xml"PublicSharedSubMain()DimtxtreaderAsXmlTextReader=NothingDimreaderAsXmlValidatingReader=NothingTry'Loadthereaderwiththedatafileand,ignoreallwhitespacenodes.txtreader=NewXmlTextReader(filename)txtreader.WhitespaceHandling=WhitespaceHandling.None'Implementthevalidatingreaderoverthetextreader.reader=NewXmlValidatingReader(txtreader)reader.ValidationType=ValidationType.None'Parsethefileanddisplayeachofthenodes.Whilereader.Read()SelectCasereader.NodeTypeCaseXmlNodeType.ElementConsole.Write(〃<{0}>〃,reader.Name)CaseXmlNodeType.TextConsole.Write(reader.Value)CaseXmlNodeType.CDATAConsole.Write(〃<![CDATA[{0}]]>〃,reader.Value)CaseXmlNodeType.ProcessingInstructionConsole.Write("<?{0}{1}?>",reader.Name,reader.Value)CaseXmlNodeType.CommentConsole.Write("<!--{0}-->",reader.Value)CaseXmlNodeType.XmlDeclarationConsole.Write("<?xmlversion='1.0'?>〃)CaseXmlNodeType.DocumentCaseXmlNodeType.DocumentTypeConsole.Write("<!DOCTYPE{0}[{1}]”,reader.Name,reader.Value)CaseXmlNodeType.EntityReferenceConsole.Write(reader.Name)CaseXmlNodeType.EndElementConsole.Write(〃</{0}>〃,reader.Name)EndSelectEndWhileFinallyIfNot(readerIsNothing)Thenreader.Close()EndIfEndTryEndSub'Main'EndclassEndClass'Sample[C#]usingSystem;usingSystem.IO;usingSystem.Xml;publicclassSample(privateconstStringfilename="items.xml";publicstaticvoidMain()(XmlTextReadertxtreader=null;XmlValidatingReaderreader=null;try(//Loadthereaderwiththedatafileandignore//allwhitespacenodes.txtreader=newXmlTextReader(filename);txtreader.WhitespaceHandling=WhitespaceHandling.None;//Implementthevalidatingreaderoverthetextreader.reader=newXmlValidatingReader(txtreader);reader.ValidationType=ValidationType.None;//Parsethefileanddisplayeachofthenodes.while(reader.Read())(switch(reader.NodeType)(caseXmlNodeType.Element:Console.Write(〃<{0}>〃,reader.Name);break;caseXmlNodeType.Text:Console.Write(reader.Value);break;caseXmlNodeType.CDATA:Console.Write(〃<![CDATA[{0}]]>〃,reader.Value);break;caseXmlNodeType.ProcessingInstruction:Console.Write("<?{0}{1}?>",reader.Name,reader.Value);break;caseXmlNodeType.Comment:Console.Write("<!--{0}-->",reader.Value);break;caseXmlNodeType.XmlDeclaration:Console.Write("<?xmlversion=T.0'?>〃);break;caseXmlNodeType.Document:break;caseXmlNodeType.DocumentType:Console.Write(〃<!DOCTYPE{0}[{1}]〃,reader.Name,reader.Value);break;caseXmlNodeType.EntityReference:Console.Write(reader.Name);break;caseXmlNodeType.EndElement:Console.Write(〃</{0}>〃,reader.Name);break;}}}finally{if(reader!=null)reader.Close();}}}//Endclass此示例的輸出顯示數(shù)據(jù)到節(jié)點類型的映射。輸出<?XMLversion=T.0'?><!--ThisisasampleXMLdocument--><!DOCTYPEItems[<!ENTITYnumber"123">]<Items><Item>Testwithanentity:123</Item><Item>testwithachildelement<more>stuff</Item><Item>testwithaCDATAsection<![CDATA[<456>]]>def</Item>

<Item>Testwithacharentity:A</Item><--Fourteencharsinthiselement.--><Item>1234567890ABCD</Item></Items>通過逐行獲取輸入并使用從代碼生成的輸出,可以使用下表分析哪個節(jié)點測試生成哪些輸出行,從而了解哪些XML數(shù)據(jù)成為哪種節(jié)點類型。輸入輸出節(jié)點類型測試輸入輸出節(jié)點類型測試<?XMLversion="1.0”?><!--這是一個示例XML文檔-<?xmlversion='1.0'?><!--這是一個示例XML文檔-->XmlNodeType.XmlDeclarationXmlNodeType.Comment-><!DOCTYPEItems[<!ENTITYnum<!DOCTYPEItems[<!ENTITYnumbXmlNodeType.DocumentTypeber"123”>]>er"123”>]<Items><Items>XmlNodeType.Element<Item><Item>XmlNodeType.ElementTestwithanentity:&number;Testwithanentity:123XmlNodeType.Text</Item></Item></Item>XmlNodeType.EndElement<Item><Item>XmNodeType.ElementtestwithachildelementtestwithachildelementXmlNodeType.Text<more><more>XmlNodeType.ElementstuffstuffXmlNodeType.Text</Item></Item>XmlNodeType.EndElement<Item><Item>XmlNodeType.ElementtestwithaCDATAsectiontestwithaCDATAsectionXmlTest.Text<![CDATA[<456>]]><![CDATA[<456>]]>XmlTest.CDATAdefdefXmlNodeType.Text</Item></Item>XmlNodeType.EndElement<Item><Item>XmlNodeType.ElementTestwithacharentity:Testwithacharentity:AXmlNodeType.Text5;</Item></Item>XmlNodeType.EndElement<!一Fourteencharsinthise<--FourteencharsinthiselemXmlNodeType.Commentlement.-->ent.--><Item><Item>XmlNodeType.Element1234567890ABCD1234567890ABCDXmlNodeType.Text</Item></Item>XmlNodeType.EndElementXmlNodeType.EndElement您必須知道分配的節(jié)點類型,因為節(jié)點類型控制哪種操作有效,以及可以設(shè)置和檢索哪種屬性。當(dāng)將數(shù)據(jù)加載到DOM中時,空白的節(jié)點創(chuàng)建受PreserveWhitespace標(biāo)志的控制。有關(guān)更多信息,請參見加載DOM時的空白和有效空白處理若要向DOM添加新節(jié)點,請參見將節(jié)點插入XML文檔中。若要從DOM中移除節(jié)點,請參見移除XMl文檔中的節(jié)點、內(nèi)容和值。若要修改DOM中的節(jié)點的內(nèi)容,請參見修改XMI文檔中的節(jié)點、內(nèi)容和值XML文檔創(chuàng)建有兩種創(chuàng)建XML文檔的方法。一種方法是創(chuàng)建不帶參數(shù)的XmlDocument。另一種方法是創(chuàng)建一個XmIDocument并將XmlNameTable作為參數(shù)傳遞給它。下面的示例顯示如何創(chuàng)建一個新的不帶參數(shù)的空XmlDocument。[VisualBasic]DimdocAsNewXMLDocument()[C#]XmlDocumentdoc=newXmlDocument();創(chuàng)建文檔后,可通過Load方法從字符串、流、URL、文本讀取器或XMLReader派生類中加載數(shù)據(jù)到該文檔中。還存在另一種加載方法,即LoadXML方法,此方法從字符串中讀取XML。有關(guān)各種Load方法的更多信息,請參見將XML文檔讀入DOM有一個名為XMLNameTable的類。此類是原子化字符串對象的表。該表為XML分析器提供了一種高效的方法,即對XML文檔中所有重復(fù)的元素和屬性名使用相同的字符串對象。創(chuàng)建文檔時(如上所示),將自動創(chuàng)建XmlNameTable,并在加載此文檔時用屬性和元素名加載XmlNameTable。如果已經(jīng)有一個包含名稱表的文檔,且這些名稱在另一個文檔中會很有用,則可使用將XmlNameTable作為參數(shù)的Load方法創(chuàng)建一個新文檔。使用此方法創(chuàng)建文檔后,該文檔使用現(xiàn)有XmlNameTable,后者包含所有已從其他文檔加載到此文檔中的屬性和元素。它可用于有效地比較元素和屬性名。有關(guān)XmlNameTable的更多信息,請參見使用XmlNameTable的對象比較。有關(guān)參考,請參見XmlNameTable成員將XML文檔讀入DOMXML信息從不同的格式讀入內(nèi)存。讀取源包括字符串、流、URL、文本讀取器或XmlReader的派生類。Load方法將文檔置入內(nèi)存中并包含可用于從每個不同的格式中獲取數(shù)據(jù)的重載方法。還存在LoadXML方法,該方法從字符串中讀取XML。不同的Load方法將影響在加載DOM時會創(chuàng)建哪些節(jié)點。下表列出了一些Load方法的區(qū)別以及講述這些區(qū)別的主題。Subject(主題)主題空白節(jié)點的創(chuàng)建。用來加載DOM的對象對DOM中生成的空白和有效空白節(jié)點有影響。有關(guān)更多信息,請參見加載DOM時的空白和有效空白處理從特定節(jié)點開始加載XML或加載整個XML文檔。使用采用XmlReader為參數(shù)的Load方法,可以從一個特定節(jié)點加載數(shù)據(jù)到DOM中。有關(guān)更多信息,請參見從讀取器中加載數(shù)據(jù)在加載前驗證XML。XmlValidatingReader是唯一派生的XmlReader,它可驗證XML。有關(guān)更多信息,請參見使用XmlValida.tingReader進行XML驗證下面的示例顯示用LoadXML方法加載XML然后將數(shù)據(jù)保存到一個名為data.xml的文本文件。[VisualBasic]OptionExplicitOptionStrictImportsSystemImportsSystem.IOImportsSystem.XMLPublicClassSamplePublicSharedSubMain()'CreatetheXmlDocument.DimdocAsNewXmlDocument()doc.LoadXml(("<bookgenre='novel'ISBN='1-861001-57-5'>"&_〃<title>PrideAndPrejudice</title>〃&_"</book>"))'Savethedocumenttoafile.doc.Save(〃data.xml〃)EndSub'MainEndClass'Sample[C#]usingSystem;usingSystem.IO;usingSystem.Xml;publicclassSample(publicstaticvoidMain()(//CreatetheXmlDocument.XmlDocumentdoc=newXmlDocument();doc.LoadXml(〃<bookgenre='novel'ISBN='1-861001-57-5'>"+"<title>PrideAndPrejudice</title>"+"</book>");//Savethedocumenttoafile.doc.Save(〃data.xml〃);}}嵌入到文檔中的樣式表指令有時,現(xiàn)有XML會包含<?xml:stylesheet...?>形式的樣式表指令。MicrosoftInternetExplorer接受此指令作為<?xml-stylesheet...?>語法的替換形式。當(dāng)XML數(shù)據(jù)包含<?xml:stylesheet...?>指令時(如下面的數(shù)據(jù)所示),試圖將此數(shù)據(jù)加載到DOM中將引發(fā)異常。<?XMLversion=〃1.0〃?><?xml:stylesheettype=〃text/xsl〃href=〃test2.xsl〃?><root><test>Node1</test><test>Node2</test></root>發(fā)生這種情況是由于<?XML:stylesheet...?>被視為DOM的無效Processinginstruction。根據(jù)XML規(guī)范中的命名空間,任何Processinginstruction都只能是NCNames(無冒號名稱),與QNames(限定名)相反。根據(jù)XML規(guī)范中的命名空間的第6節(jié),使Load和LoadXml方法符合此規(guī)范所產(chǎn)生的影響是,在文檔中:?所有元素類型和屬性名都應(yīng)包含零個或一個冒號。?任何實體名稱、Processinginstruction目標(biāo)或表示法名稱都不能包含冒號。<?迎:stylesheet...?>包含有一個冒號,違反了上面的第二條規(guī)則。根據(jù)“將樣式表與XML文檔關(guān)聯(lián)1.0版”建議(位于/TR/xml-stylesheet),將XSL樣式表與XML文檔關(guān)聯(lián)的處理指令是<?xml-stylesheet...?>(用短劃線代替冒號)。如果使用Load方法和XMLReader參數(shù)加載文檔,則此行為與從其他格式加載數(shù)據(jù)時發(fā)生的行為有所不同。如果讀取器處于初始狀態(tài)(檢查方法是查看ReadState屬性是否等于ReadState.Initial),則Load使用讀取器中的全部內(nèi)容并從讀取器中的所有數(shù)據(jù)生成DOM。如果讀取器已定位在文檔中某個位置的節(jié)點上,然后將讀取器傳遞給Load方法,則Load將試圖讀取當(dāng)前節(jié)點及其所有同輩。直到關(guān)閉當(dāng)前路徑的結(jié)束標(biāo)記進入內(nèi)存中,此操作才完成。Load成功與否取決于加載嘗試發(fā)生時讀取器所在的節(jié)點,因為Load驗證讀取器中的XML的格式是否正確。如果XML的格式不正確,Load將引發(fā)異常。例如,下面的節(jié)點集包含兩個根級別元素,且XML的格式不正確,因此Load引發(fā)異常。?Comment節(jié)點,后足艮Element節(jié)點,后足艮Element節(jié)點,后足艮EndElement節(jié)點。下面的節(jié)點集創(chuàng)建不完整的DOM,原因是沒有根級別元素。?Comment節(jié)點,后足艮Processinginstruction節(jié)點,后足艮Comment節(jié)點,后足艮EndElement節(jié)點。這不引發(fā)異常,并且加載數(shù)據(jù)??梢韵蜻@些節(jié)點的頂部添加根元素并創(chuàng)建保存時不會發(fā)生錯誤的格式正確的XML如果讀取器定位在對文檔的根級別無效的葉節(jié)點上(如空白或?qū)傩怨?jié)點),則讀取器繼續(xù)讀取,直到定位在一個可用于根的節(jié)點上。文檔在此時開始加載。默認(rèn)情況下,Load不使用DTD或架構(gòu)驗證檢查XML是否有效。它只檢查XML的格式是否正確。為使驗證發(fā)生,需傳入XmlValidatingReader,指定相應(yīng)的ValidationType并提供ValidationEventHandler。有關(guān)XmlValidatingReader的更多信息,請參見使用XmlValidatingReader進彳亍XML驗證。有關(guān)事件處理的更多信息,請參見使用XmlNodeChangedEventArgs的XML文檔中的事件處理在XML加載到DOM中時對其進行驗證如果要在加載XML時對照DTD或架構(gòu)對其進行驗證,需要將XmlValidatingReader傳遞給Load方法。事先必須已將XmlValidatingReader的ValidationType屬性設(shè)置為ValidationType枚舉中某個值(ValidationType.None除外),并且需要提供ValidationEventHandler。在執(zhí)行此操作的過程中,Load會通知您在加載過程中發(fā)現(xiàn)的驗證錯誤。除非ValidationEventHandler停止加載過程,否則,即使發(fā)現(xiàn)錯誤,文檔仍會加載到內(nèi)存中。有關(guān)XmlValidatingReader的更多信息,請參見使用XmlValidatingReader進行XML驗證將節(jié)點插入XML文檔中可以通過插入新節(jié)點來修改文檔。節(jié)點可以是新創(chuàng)建的,存在于同一文檔中,也可以從另一個文檔導(dǎo)入。有關(guān)創(chuàng)建新節(jié)點的更多信息,請參見在DOM中創(chuàng)建新節(jié)點。有關(guān)復(fù)制現(xiàn)有節(jié)點的更多信息,請參見復(fù)制現(xiàn)有節(jié)點、將現(xiàn)有節(jié)點從一個文檔復(fù)制到另一個文檔或復(fù)制文檔片段在DOM中創(chuàng)建新節(jié)點XMLDocument具有用于所有節(jié)點類型的Create方法。為該方法提供名稱(需要時)以及那些具有內(nèi)容的節(jié)點(如文本節(jié)點)的內(nèi)容或其他參數(shù),這樣便可創(chuàng)建節(jié)點。下面的方法需要填充名稱和幾個其他參數(shù)以創(chuàng)建相應(yīng)的節(jié)點。CreateCommentCreateCDataSectionCreateDocumentFragmentCreateDocumentTypeCreateElementCreateProcessingInstructionCreateTextNodeCreateXMIDeclarationCreateWhitespaceCreateSignificantWhitespace其他節(jié)點類型不僅僅只要求向參數(shù)提供數(shù)據(jù)。有關(guān)屬性的信息,請參見為DOM中的亓素創(chuàng)建新屬性。有關(guān)元素和屬性名驗證的信息,請參見創(chuàng)建新節(jié)點時的XML元素和屬性名驗證。有關(guān)如何創(chuàng)建實體引用,請參見創(chuàng)建新實體引用。有關(guān)命名空間如何影響實體引用擴展的信息,請參見命名空間對包含元素和屬性的新節(jié)點的實體引用擴展的影響創(chuàng)建新節(jié)點后,有幾個方法可用于將其插入到樹中。下表列出了這些方法,并描述了新節(jié)點在DOM中的位置。方法節(jié)點位置InsertBefore插入到引用節(jié)點之前。例如,在位置5插入新節(jié)點:[VisualBasic]DimrefChildAsXMLNode=node.ChildNodes(4)'Thereferenceiszero-based.node.InsertBefore(newChild,refChild);[C#]XmlNoderefChild=node.ChildNodes

InsertAfterAppendChildPrependChildAppend[4];//Thereferenceiszero-based.node.InsertBefore(newChild,refChild);有關(guān)更多信息,請參見XMLNode.InsertBefore方法插入到引用節(jié)點之后。例如:[VisualInsertAfterAppendChildPrependChildAppend[4];//Thereferenceiszero-based.node.InsertBefore(newChild,refChild);有關(guān)更多信息,請參見XMLNode.InsertBefore方法插入到引用節(jié)點之后。例如:[VisualBasic]node.InsertAfter(newChild,refChild)[C#]node.InsertAfter(newChild,refChild);有關(guān)更多信息,請參見XMLNode.InsertAfter方法將節(jié)點添加到給定節(jié)點的子節(jié)點列表的末尾。如果所添加的節(jié)點是XMLDocumentFragment,則會將文檔片段的全部內(nèi)容移至該節(jié)點的子列表中。有關(guān)更多信息,請參見XmlNode.AppendChild方法將節(jié)點添加到給定節(jié)點的子節(jié)點列表的開頭。如果所添加的節(jié)點是XmlDocumentFragment,則會將文檔片段的全部內(nèi)容移至該節(jié)點的子列表中。有關(guān)更多信息,請參見XmlNode.PrependChild方法將XmlAttribute節(jié)點追加到與元素關(guān)聯(lián)的屬性集合的末尾。有關(guān)更多信息,請參見XmlAttributeCollection.Append方法?獲取元素節(jié)點并使用SetAttribute將屬性添加到該元素的屬性集合。?使用CreateAttribute方法創(chuàng)建XMLAttribute節(jié)點,獲取元素節(jié)點,然后使用SetAttributeNode將節(jié)點添加到該元素的屬性集合。下面的示例顯示如何使用SetAttribute方法將屬性添加到元素。[VisualBasic]ImportsSystemImportsSystem.IOImportsSystem.XMLpublicclassSamplepublicsharedsubMain()DimdocasXmlDocument=newXmlDocument()doc.LoadXml("<bookxmlns:bk='urn:samples'bk:ISBN='1-861001-57-5'>〃&_〃<title>PrideAndPrejudice</title>〃&_"</book>")DimrootasXmlElement=doc.DocumentElement'Addanewattribute.root.SetAttribute(〃genre〃,〃urn:samples〃,"novel")Console.WriteLine("DisplaythemodifiedXML...")Console.WriteLine(doc.InnerXml)endsubendclass[C#]usingSystem;usingSystem.IO;usingSystem.Xml;publicclassSamplepublicstaticvoidMain()(XmlDocumentdoc=newXmlDocument();doc.LoadXml("<bookxmlns:bk='urn:samples'bk:ISBN='1-861001-57-5'>〃+〃<title>PrideAndPrejudice</title>〃+"</book>");XmlElementroot=doc.DocumentElement;//Addanewattribute.root.SetAttribute(〃genre〃,〃urn:samples〃,"novel");Console.WriteLine(〃DisplaythemodifiedXML...");Console.WriteLine(doc.InnerXml);}下面的示例顯示一個用CreateAttribute方法創(chuàng)建的新屬性。然后顯示使用SetAttributeNode方法添加到book元素的屬性集合的屬性。已知下列XML[VisualBasic,C#]<bookgenre='novel'ISBN=T-861001-57-5'><title>PrideAndPrejudice</title></book>創(chuàng)建一個新屬性并為其提供值:[VisualBasic]DimattrAsXMLAttribute=doc.CreateAttribute("publisher")attr.Value="WorldWidePublishing"[C#]XmlAttributeattr=doc.CreateAttribute(〃publisher〃);attr.Value="WorldWidePublishing";將其附加到此元素:[VisualBasic]doc.DocumentElement.SetAttributeNode(attr)[C#]doc.DocumentElement.SetAttributeNode(attr);輸出<bookgenre="novel"ISBN="1-861001-57-5"publisher="WorldWidePublishing"><title>PrideAndPrejudice</title></book>完整代碼示例位于XMLDocument.CreateAttribute方法還可以創(chuàng)建一個XMLAttribute節(jié)點并使用InsertBefore或InsertAfter方法將其放在集合中的適當(dāng)位置。如果該屬性集合中已存在一個同名屬性,則從該集合中移除現(xiàn)有的XmlAttribute節(jié)點并插入新的XmlAttribute節(jié)點。這與SetAttribute方法執(zhí)行的方式相同。這些方法(作為參數(shù))將現(xiàn)有節(jié)點作為參考點以執(zhí)行InsertBefore和InsertAfter。如果不提供指示插入新節(jié)點位置的引用節(jié)點,則InsertAfter方法的默認(rèn)設(shè)置是在集合的開頭插入新節(jié)點。如果未提供任何引用節(jié)點,則InsertBefore的默認(rèn)位置是集合的末尾。如果創(chuàng)建了屬性的XMLNamedNodeMap,則可以使用SetNamedItem方法按名稱添加屬性。有關(guān)更多信息,請參見NamedNodeMap和NodeList中的節(jié)點集合默認(rèn)屬性如果創(chuàng)建一個聲明為具有默認(rèn)屬性的元素,則DOM創(chuàng)建一個帶默認(rèn)值的新默認(rèn)屬性并將其附加到該元素。此時還創(chuàng)建默認(rèn)屬性的子節(jié)點。

屬性子節(jié)點屬性節(jié)點的值成為它的子節(jié)點。只存在兩種類型的有效子節(jié)點:XMLText節(jié)點和XmlEntityReference節(jié)點。從FirstChild和LastChild等方法將這些節(jié)點按子節(jié)點來處理這一點上說,它們是子節(jié)點。當(dāng)試圖移除屬性或?qū)傩宰庸?jié)點時,屬性這種具有子節(jié)點的特性很重要。有關(guān)更多信息,請參見移除DOM中元素節(jié)點的屬性復(fù)制現(xiàn)有節(jié)點DOM中有許多方法和屬性可用來選擇節(jié)點,如SelectSingleNode、ChildNodes[inti]、Attributes[inti]。選擇節(jié)點后,可以使用適用于特定節(jié)點類型的插入方法之一將該節(jié)點插入到樹中。將節(jié)點插入到樹中的唯一限制是在插入節(jié)點后文檔仍必須是格式正確的。將現(xiàn)有節(jié)點插入到DOM樹中時,該節(jié)點從其原始位置移除并添加到它的目標(biāo)位置。將現(xiàn)有節(jié)點從一個文檔復(fù)制到另一個文檔ImportNode方法是將節(jié)點或整個節(jié)點子樹從一個XMLDocument復(fù)制到另一個XmlDocument的機制。調(diào)用返回的節(jié)點是源文檔節(jié)點的副本,其中包括屬性值、節(jié)點名、節(jié)點類型以及所有與命名空間相關(guān)的屬性(如前綴、本地名稱和命名空間URI)。源文檔不更改。導(dǎo)入該節(jié)點后,仍需使用插入節(jié)點的方法之一將該節(jié)點添加到樹種。節(jié)點附加到它的新文檔后,它歸此新文檔所有。原因是每個節(jié)點在創(chuàng)建后都具有所屬文檔,即使節(jié)點是在單獨的文檔片段中創(chuàng)建的。這是DOM的要求并由XMLDocument類的工廠創(chuàng)建設(shè)計強制,例如,CreateElement是創(chuàng)建新節(jié)點的唯一方法。根據(jù)導(dǎo)入節(jié)點的節(jié)點類型和deep參數(shù)的值,將復(fù)制適當(dāng)?shù)母郊有畔ⅰ4朔椒▏L試鏡像當(dāng)XML片段或HTML源從一個文檔復(fù)制到另一個文檔時的預(yù)期行為,以說明一個事實:對于XML,兩個文檔可能具有不同的DTD。下表描述了可導(dǎo)入的每種節(jié)點類型的特定行為。節(jié)點類型deep參數(shù)為truedeep參數(shù)為false

XMLAttributeXmlAttribute.Specified屬性在deep參數(shù)不適用于XmlAttributeXmlAttribute上設(shè)置為true節(jié)點類型deep參數(shù)為truedeep參數(shù)為falseXMLAttributeXmlAttribute.Specified屬性在deep參數(shù)不適用于XmlAttributeXmlAttribute上設(shè)置為true。遞節(jié)點,因為這些節(jié)點在導(dǎo)入時總是攜歸導(dǎo)入源XmlAttribute的子代,帶其子節(jié)點。XmlCDataSectionXmlCommentXmlDocumentFragmentXmlDocumentTypeXmlElement并重組結(jié)果節(jié)點以構(gòu)成相應(yīng)的子樹。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。遞歸導(dǎo)入源代碼的子代,并重組結(jié)創(chuàng)建空的XmlDocumentFragment。果節(jié)點以構(gòu)成相應(yīng)的子樹。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。遞歸導(dǎo)入源元素的子代,并重組結(jié)導(dǎo)入源元素的指定屬性節(jié)點,并將生果節(jié)點以構(gòu)成相應(yīng)的子樹。成的XmlAttribute節(jié)點附加到新注意不復(fù)制默認(rèn)屬性。如果導(dǎo)入元素。不復(fù)制子代節(jié)點。到的文檔定義該元素名稱的默認(rèn)屬注意不復(fù)制默認(rèn)屬性。如果導(dǎo)入性,則分配這些默認(rèn)屬性。到的文檔定義該元素名稱的默認(rèn)屬性,則分配這些默認(rèn)屬性。XmlEntityReference因為源文檔和目標(biāo)文檔可能以不同因為源文檔和目標(biāo)文檔可能以不同的方式定義實體,所以該方法僅復(fù)的方式定義實體,所以該方法僅復(fù)制制XmlEntityReference節(jié)點。不XmlEntityReference節(jié)點。不包括包括替換文本。如果目標(biāo)文檔定義替換文本。如果目標(biāo)文檔定義了實XmlProcessingInstructionXmlTextXmlSignificantWhitespaceXmlWhitespaceXmlDeclaration所有其他節(jié)點類型了實體,則給它賦值。從導(dǎo)入的節(jié)點復(fù)制目標(biāo)和數(shù)據(jù)值。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。從導(dǎo)入的節(jié)點復(fù)制目標(biāo)和數(shù)據(jù)值。不能導(dǎo)入這些節(jié)點類型。體,則給它賦值。從導(dǎo)入的節(jié)點復(fù)制目標(biāo)和數(shù)據(jù)值。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。復(fù)制該節(jié)點,包括復(fù)制其數(shù)據(jù)。從導(dǎo)入的節(jié)點復(fù)制目標(biāo)和數(shù)據(jù)值。不能導(dǎo)入這些節(jié)點類型。*注意盡管可以導(dǎo)入DocumentType節(jié)點,但一個文檔只能有一個DocumentType。因此,導(dǎo)入文檔類型后,在將其插入到樹中之前必須確保文檔中沒有任何文檔類型。有關(guān)移除節(jié)點的信息,請參見移除XMI文檔中的節(jié)點、內(nèi)容和值復(fù)制文檔片段可以創(chuàng)建一個XMLDocumentFrament節(jié)點,然后在它下面添加節(jié)點。當(dāng)使用InsertNode方法插入XmlDocumentFragment時,不復(fù)制XmlDocumentFrament節(jié)點,但在DOM中插入它的子節(jié)點。移除XML文檔中的節(jié)點、內(nèi)容和值DOM在內(nèi)存中之后,可以移除樹中的節(jié)點,或移除特定節(jié)點類型中的內(nèi)容和值。有關(guān)如何從文檔中移除葉節(jié)點或整個節(jié)點子樹的信息,請參見從DOM中移除節(jié)點。有關(guān)如何移除元素屬性的信息,請參見移除DOM中亓素節(jié)點的屬性。有關(guān)如何移除節(jié)點內(nèi)容但將節(jié)點保留在樹中的信息,請參見移除DOM中的節(jié)點內(nèi)容從DOM中移除節(jié)點若要從DOM中移除節(jié)點,請使用RemoveChild方法移除特定節(jié)點。移除節(jié)點時,此方法移除屬于所移除的節(jié)點的子樹(即如果它不是葉節(jié)點)。若要從DOM中移除多個節(jié)點,請使用RemoveAll方法移除當(dāng)前節(jié)點的所有子級和屬性(如果適用)。如果使用XMLNamedNodeMap,則可以使用RemoveNamedItem方法移除節(jié)點。若要移除屬性,請參見移除DOM中元素節(jié)點的屬性移除DOM中元素節(jié)點的屬性有多種方法可以移除屬性。一種方法是從屬性集合中移除它們。為此,請執(zhí)行下列步驟:使用XMLAttributeCollectionattrs=elem.Attributes;獲取元素的屬,性集合。使用以下三種方法之一移除屬性集合中的屬性:使用XMLAttributeCollection.Remove方法移除特定屬性。使用XMLAttributeCollection.RemoveAll方法移除集合中的所有屬性,使元素不具有任何屬性。使用XMLAttributeCollection.RemoveAt方法移除屬性集合中的屬性(通過使用其索引號)。下列方法移除元素節(jié)點中的屬性。?使用XMLElement.RemoveAllAttributes移除屬性集合。?使用XMLElement.RemoveAttribute方法按名稱移除集合中的單個屬性。?使用XMLElement.RemoveAttributeAt按索引號移除集合中的單個屬性。另一個替換方法是獲取元素,獲取屬性集合中的屬性并直接移除屬性節(jié)點。若要獲取屬性集合中的屬性,可使用名稱XMLAttributeattr=attrs[〃attr_name〃];、索弓|XmlAttributeattr=attrs[0];或用命名空間XmlAttributeattr=attrs[〃attr_localName〃,"attr_namespace〃]完全限定該名稱。無論用于移除屬性的方法是什么,當(dāng)移除在DTD中定義為默認(rèn)屬性的屬性時有特殊限制。除非移除了默認(rèn)屬性所屬的元素,否則不能移除默認(rèn)屬性。已聲明了默認(rèn)屬性的元素總是存在默認(rèn)屬性。移除XMLAttributeCollection或XmlElement中的默認(rèn)屬性可導(dǎo)致將替換屬性插入到元素的XmlAttributeCollection中,并初始化為已聲明的默認(rèn)值。如果將某個元素定義為<bookatt[="1"att2="2"att3="3"></book>,則將得到一個具有三個已聲明的默認(rèn)屬性的book元素。DOM實現(xiàn)保證只要此book元素存在,它就具有這三個默認(rèn)屬性:att1、att2和att3。當(dāng)用XMLAttribute調(diào)用時,RemoveAll將該屬性值設(shè)置為String.Empty,因為屬性沒有值便無法存在。移除DOM中的節(jié)點內(nèi)容對于從XMLCharacterData繼承的節(jié)點類型(即XmlComment、XmlText、XmlCDataSection、XmlWhitespace和XmlSignificantWhitespace節(jié)點類型),可以使用DeleteData方法移除字符,此方法從節(jié)點中移除某個范圍的字符。如果要完全移除內(nèi)容,則移除包含此內(nèi)容的節(jié)點。如果要保留節(jié)點,但節(jié)點內(nèi)容不正確,則修改內(nèi)容。有關(guān)修改節(jié)點內(nèi)容的信息,請參見修改XML文檔中的節(jié)點、內(nèi)容和值修改XML文檔中的節(jié)點、內(nèi)容和值有多種方法可以修改文檔中的節(jié)點和內(nèi)容。您可以:?使用XMLNode.Value方法更改節(jié)點值。?通過用新節(jié)點替換節(jié)點來修改全部節(jié)點集。這可使用XMLNode.InnerXml屬性完成。?使用XMLNode.ReplaceChild方法用新節(jié)點替換現(xiàn)有節(jié)點。?使用XMLCharacterData.AppendData方法、XmlCharacterData.InsertData方法或XmlCharacterData.ReplaceData方法將附加字符添加到從XmlCharacter類繼承的節(jié)點。?對從XMLCharacterData繼承的節(jié)點類型使用DeleteData方法移除某個范圍的字符來修改內(nèi)容。使用SetAttribute方法更新屬性值。如果不存在屬性,SetAttribute創(chuàng)建一個新屬性;如果存在屬性,則更新屬性值。更改節(jié)點值的一個簡單方法是使用node.Vame="newva^e”;。下表列出了此單個代碼行作用于的節(jié)點類型,以及對于該節(jié)點類型將更改的確切數(shù)據(jù)。節(jié)點類型更改的數(shù)據(jù)Attribute屬性的值。CDATASectionCDATASection的內(nèi)容。Comment注釋的內(nèi)容。Processinginstruction內(nèi)容(不包括目標(biāo))。Text文本的內(nèi)容。XMLDeclarationWhitespace聲明的內(nèi)容(不包括<?xml和?>標(biāo)記)??瞻椎闹怠?梢詫⒃撝翟O(shè)置為四個可識別的XML空白字符之一:空格、制表符、回車或換行。SignificantWhitespace有效空白的值。可以將該值設(shè)置為四個可識別的XML空白字符之一:空格、制表符、回車或換行。該表中未列出的任何節(jié)點類型都不是設(shè)置了值的有效節(jié)點類型。設(shè)置任何其他節(jié)點類型的值都將引發(fā)InvalidOperationException。InnerXML屬性更改當(dāng)前節(jié)點的子節(jié)點標(biāo)記。設(shè)置此屬性將用給定字符串的分析內(nèi)容替換子節(jié)點。分析在當(dāng)前命名空間上下文中執(zhí)行。此外,InnerXml移除多余的命名空間聲明。因此,大量的剪切和粘貼操作并不會使文檔的大小因多余的命名空間聲明而增加。有關(guān)顯示命名空間對InnerXml操作的影響的代碼示例,請參見XmlDocument.InnerXml屬性當(dāng)使用ReplaceChild和RemoveChild方法時,這兩個方法返回已替換或移除的節(jié)點。然后,此節(jié)點可以重新插入到DOM中的其他位置。ReplaceChild方法對插入到文檔中的節(jié)點執(zhí)行兩個驗證檢查。第一個檢查確保該節(jié)點成為某個節(jié)點的子級,這個節(jié)點可具有其類型的子節(jié)點。第二個檢查確保插入的節(jié)點不是它成為其子級的節(jié)點的上級。違犯這兩個條件中的任何一個都將引發(fā)InvalidOperationException異常。向可編輯的節(jié)點中添加或從中移除只讀子級是有效的。然而,試圖修改只讀節(jié)點本身將引發(fā)InvalidOperationException異常。修改XMLEntityReference節(jié)點的子級便屬于這種情況。該子級是只讀的,因此無法修改。任何修改它們的嘗試都將引發(fā)InvalidOperationException。保存和寫出文檔當(dāng)加載并保存XMLDocument時,所保存的文檔在下列方面可能與原始文檔存在差異:?如果在調(diào)用Save方法前將PreserveWhitespace屬性設(shè)置為true,則在輸出中將保留文檔中的空白;否則,如果此屬性為false,XMLDocument會自動縮進輸出。?各個屬性之間的所有空白都縮減為一個空白字符。?更改元素間的空白。保留有效空白,但不保留無效空白。但是,當(dāng)保存文檔時,文檔在默認(rèn)情況下將使用XMLTextWriterIndenting模式整齊地打印輸出,以使其更易于閱讀。?屬性值兩邊所用的引號字符在默認(rèn)情況下更改為雙引號。可以使用XMLTextWriter的QuoteChar屬性將引號字符設(shè)置為雙引號或單引號。?默認(rèn)情況下,保留像&abc;這樣的常規(guī)實體。但如果構(gòu)造一個具有ExpandEntities的默認(rèn)EntityHandling設(shè)置的XMLValidatingReader,然后調(diào)用Load,則常規(guī)實體將被擴展,從而丟失已保存文檔中的常規(guī)實體。?默認(rèn)情況下,擴展像{這樣的數(shù)字字符實體。?不保留輸入文檔中的字節(jié)順序標(biāo)記。除非顯式創(chuàng)建指定不同編碼的XML聲明,否則UCS-2保存為UTF-8。?如果要將XMLDocument寫出到文件或流中,則寫出的輸出與文檔內(nèi)容相同。也就是說,僅當(dāng)文檔中包含XmlDeclaration時才寫出XmlDeclaration,并且寫出文檔時所使用的編碼與聲明節(jié)點中給定的編碼相同。寫出XMLDeclaration除了Save和WriteContentTo的XMLDocument方法外,OuterXml、InnerXml和WriteTo的XmlDocument和XmlDeclaration方法也創(chuàng)建XML聲明。對于OuterXML、InnerXml的XmlDocument方法以及Save(Streamstm)、Save(Stringfilename)>WriteTo和WriteConentTo方法,在XML聲明中寫出的編碼是從XmlDeclaration節(jié)點中獲取的。如果不存在XmlDeclaration節(jié)點,則不寫出XmlDeclaration。如果XmlDeclaration節(jié)點中沒有編碼,則在XML聲明中不寫出編碼。Save(TextWriterwriter)和Save(XMLWriterwriter)方法總寫出XmlDeclaration。這些方法從其寫入的編寫器中獲取編碼。也就是說,編寫器的編碼值重寫文檔和XmlDeclaration對象的編碼。例如,下列代碼不在輸出文件out.xml中的XML聲明中寫出編碼。[VisualBasic]DimtwAsNewXMLTextWriter("out.xml",Nothing)doc.load(〃text.xml〃)doc.Save(tw)[C#]XmlTextWritertw=newXmlTextWriter(〃out.xml〃,null);doc.load(〃text.xml〃);doc.Save(tw);對于Save(XMLTextWriterwriter)方法,通過XmlWriter類中的WriteStartDocument方法寫出XML聲明。因此,改寫WriteStartDocument方法將更改文檔開頭的寫出方式。對于OuterXML、WriteTo和InnerXml的XmlDeclaration方法,如果未設(shè)置Encoding屬性,則不寫出任何編碼。否則,在XML聲明中寫出的編碼與Encoding屬性中的編碼相同。用OuterXML屬性寫出文檔內(nèi)容OuterXML屬性是Microsoft對W3C文檔對象模型標(biāo)準(zhǔn)的擴展。OuterXml屬性用于獲取整個XML文檔的標(biāo)記,或只獲取單個節(jié)點及其子節(jié)點的標(biāo)記。OuterXml返回表示給定節(jié)點及其所有子節(jié)點的標(biāo)記。下面的代碼示例顯示了如何將整個文檔保存為一個字符串。[VisualBasic]DimmydocAsNewXMLDocument()'Performapplicationneedshere,likemydoc.Load(〃myfile〃);'Nowsavetheentiredocumenttoastringvariablecalled"xml".DimxmlAsString=mydoc.OuterXml[C#]XMLDocumentmydoc=newXmlDocument();//Performapplicationneedshere,likemydoc.Load(〃myfile〃);//Nowsavetheentiredocumenttoastringvariablecalled"xml".stringxml=mydoc.OuterXml;下面的代碼示例顯示了如何只保存文檔元素。[VisualBasic]'ForthecontentoftheDocumentElementonly.DimXMLAsString=mydoc.DocumentElement.OuterXml[C#]//ForthecontentoftheDocumentElementonly.stringXML=mydoc.DocumentElement.OuterXml;與此相反,如果您需要子節(jié)點的內(nèi)容,可以使用InnerText屬性。OuterXML屬性有一個方面影響它從文檔中生成的輸出,例如,當(dāng)您在XML中將一個元素定義為EntityReference節(jié)點時。在DTD中,您已用一個默認(rèn)屬性定義了該元素。OuterXml屬性不寫出該元素的默認(rèn)屬性。例如,假定已聲明了下面這一常規(guī)實體,替換文本在一個稱為013.ent的文件中,如下所示:013.ent<e/>例如,下面這一稱為X_Entity.XML的XML中包含一個DTD,其元素定義為具有默認(rèn)屬性:X_Entity.XML<!DOCTYPEdoc[<!ELEMENTdoc(e)><!ELEMENTe(#PCDATA)><!ATTLISTea1CDATA"a1default"a2NMTOKENS"a2default"><!ENTITYxSYSTEM"013.ent">]><doc>&x;</doc>在分析此XML時,代碼行<!ENTITYxSYSTEMO13.enb,>定義了在何處查找實體x的替換文本。在分析該文檔并遇到&x;EntityReference時,將找到013.ent文件并將&x;替換為其定義。其定義的重要部分變成了如下所示的xml數(shù)據(jù):<doc><ea1="a1default"a2="a2default"/></doc>然而,在使用OuterXML屬性時,實際的輸出是:輸出<!DOCTYPEdoc[<!ELEMENTdoc(e)><!ELEMENTe(#PCDATA)><!ATTLISTea1CDATA"a1default"a2NMTOKENS"a2default"><!ENTITYxSYSTEM"013.ent">]><doc><e/></doc>—AttributeCount2下面的代碼用來測試默認(rèn)屬性并顯示不包含DTD中定義的默認(rèn)屬性的輸出。[VisualBasic]ImportsSystemImportsSystem.DataImportsSystem.XMLImportsSystem.Xml.XPathImportsSystem.Runtime.RemotingNamespaceTestSimplePub

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論