NET Framework 中的 XML 设计目标_第1页
NET Framework 中的 XML 设计目标_第2页
NET Framework 中的 XML 设计目标_第3页
NET Framework 中的 XML 设计目标_第4页
NET Framework 中的 XML 设计目标_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

使用.NETFramework中的XML(DOM)[日期:2007-08-01]来源:作者:[字体:大中小].NETFramework中的XML类提供全面、集成的类集,使您得以使用XML文档和数据。.NETFramework中的XML类可以分为几组:用XmlReader和XmlWriter分析和编写XML,用XmlValidatingReader验证XML,和用XmlDocument编辑XML文档。XslTransform、XmlSchema和XPathNavigator类支持执行XSL转换(XSLT)、编辑XML架构定义语言(XSD)架构和应用XPath查询。.NETFramework中的XML设计目标.NETFramework中的XML目标是:•符合W3C标准。•扩展性。•可插接式结构。•性能。•与ADO.NET紧密集成。符合标准符合标准意味着类完全符合XML、命名空间、XSLT、XPath、架构和文档对象模型(DOM)的当前W3C建议标准。符合标准确保了互操作性并使跨平台应用程序开发变得容易。最显著的一点是,.NETFramework中的XML类支持W3CXML架构定义语言(XSD)1.0建议。.NETFramework中有一些XML类提供验证,还有一个对象模型可用于在内存中生成XSD架构。可针对架构、DTD、XDR和XSD进行验证的快速只进分析器称为XmlValidatingReader。XmlValidatingReader是符合标准的XML分析器。XmlSchemaCollection类可用于在使用XmlValidatingReader时缓存常用的XSD或XDR架构。.NETFramework中有一个XML类集提供架构对象模型(SOM),使用该模型可以以编程方式生成和编译XSD架构。XmlSchema类表示XSD架构。使用XmlReader和XmlWriter类可以加载和保持这些架构。XMLDocument类实现文档对象模型级别1和级别2建议,它是根据.NETFramework的通用设计指南定制的。例如,方法名称使用大写字母。XslTransform类符合用于使用XSLT转换文档的XSL转换(XSLT)1.0版建议和XML路径语言(XPath)1.0建议。扩展性.NETFramework中的XML通过使用抽象基类和虚方法而变得可扩展。这种扩展性(或子类创建)由XmlReader、XmlWriter和XPathNavigator抽象类阐释,这些抽象类是使得能够在不同的存储区或数据源上开发新实现的类和公开XML的类。例如,XPathNavigator是集成了XPath查询引擎的API,该引擎可在现有存储区(如文件系统、注册表和关系数据库)上实现。它不仅将数据显示为XML,还使用XPathAPI查询方法(如Select)的默认实现,提供对不同数据源的XPath查询支持。扩展性的另一个示例是XMLReader,它提供一个用于对存储区进行快速只进分析的API,公开在它移动通过流时所发现的XMLInfoset。.NETFramework中的XML具有以下XmlReader实现:用于读取流的XmlTextReader类、用于读取节点树的XmlNodeReader类和用于在XmlTextReader上分层验证支持的XmlValidatingReader。XMLWriter使用基于推送的API生成XML流。.NETFramework中的XML具有一个称为XmlTextWriter的XmlWriter实现。可以进一步从这些类的实现派生,创建可以实现特定处理的其他读取器。例如,通过从XMLTextReader派生,创建一个称为MyXmlTextReader的自定义读取器,可以创建具有特定于应用程序处理需求的逻辑的读取器版本。XMLResolver抽象类提供XML文档中引用的外部资源的挂钩。这使您可以用特定于应用程序(如数据库)的方式来缓存资源,或通过从该类派生来解析具有不同协议的资源。XmlResolver的两个实现XmlUrlResolver和XmlSecureResolver将解析使用http://、https://和file://协议的资源。可插接式结构.NETFramework中的XML具有可插接式结构。在此基于流的结构中,可插接式意味着可以很容易替代.NETFramework中基于这些抽象类的组件。可插接式结构还意味着数据可以在组件之间以流的形式传送,以及插入到此流中的新组件可以改变处理。例如,来自XMLWebservices的流可用XmlTextReader分析。可以使用XmlTextReader创建XmlDocument,然后可以使用XmlDocument创建XmlNodeReader。另一个示例是从XMLReader加载DOM(XmlDocument类)并使用XmlWriter保存输出。通过扩展现有类来创建自己的这些类的实现,可以影响XmlDocument类的行为。例如,如果创建了一个称为MyXmlFileReader的XmlReader实现,并且它可以将文件系统公开为XML,则可以从此读取器加载XmlDocument。或者可以从XmlTextReader继承,创建一个新的自定义读取器将以属性为中心的文档转换为以元素为中心的文档,它可以用于加载XmlDocumento这为基于现有类的新类提供了可插接式结构。将组件插接在一起的另一个示例是在转换过程中使用不同的数据存储区(如XPathDocument和XMLDocument)。这些数据存储区可用XslTransform类转换,输出然后可以流入另一个存储区或以流的形式从XMLWebservices返回。下图说明了这一点。使用XslTransform类对数据进行流处理通过使用IXPathNavigable接口,实现XPathNavigator的任何存储区都可以插入到XslTransform类中以允许对该存储区进行XSLT转换。XMLDocument、XPathDocument和XmlDataDocument类具有此能力。然后,来自XslTransform的流式输出可以发送到可插接式结构样式的XmlReader或XmlWriter。性能.NETFramework中的XML类表示低级别XML处理组件,这些组件不仅用作.NETFramework的一部分,还用于将XML集成到应用程序中。这些类需要具有极高的性能。.NETFramework中的XML类旨在支持基于流处理的模型,它具有下列特性:•使用XMLReader进行的只进、拉模型分析所用的缓存最小。•使用XMLValidatingReader进行只进验证。•XPathNavigator的创新游标样式导航,它将节点创建最小化为单个虚节点,但仍提供对文档的随机访问。这不需要在内存中生成完整的节点树,如DOM。•来自XslTransform类的增量流式输出。XPathDocument是XPath查询的优化只读存储区,建议在需要进行XSLT处理的任何时候都使用它。通过使用此存储区和XslTransform类,可以实现高性能的XSLT转换。与ADO.NET集成通过XML类和ADO.NET之间的紧密集成,关系数据和XML在.NETFramework中结合在一起。DataSet组件表示断开连接的数据库,它能够使用XMLReader和XmlWriter类读取和写入XML、将其内部关系架构结构保持为XML架构(XSD)以及从XML文档推测架构结构。通过将DataSet与XMLDocument同步,使其中一个所维护的数据在适当的时候在另一个中得到更新,XmlDataDocument确实超出了XML和关系数据领域的边界。由于XmlDocument能够存储半结构化数据,因此在获得XML存储区的所有功能的同时,DataSet基于它的架构提供XML上的关系视图。有关.NETFramework如何通过DataSet对象和XMLDataDocument对象启用对数据的关系和分层表示形式的实时同步访问的更多信息,请参见关系数据和ADO.NET的XMI集成XML文档对象模型(DOM)文档对象模型(DOM)类是XML文档的内存中表示形式。DOM使您能够以编程方式读取、操作和修改XML文档。XmlReader类也读取XML,但它提供非缓存的只进、只读访问。这意味着使用XmlReader无法编辑属性值或元素内容,或无法插入和移除节点。编辑是DOM的主要功能。XML数据在内存中表示是常见的结构化方法,尽管实际的XML数据在文件中时或从另一个对象传入时以线性方式存储。以下是XML数据。输入<?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数据读入DOM结构中时内存的构造。XML文档结构在XML文档结构中,此图中的每个圆圈表示一个节点(称为XmlNode对象)。XmlNode对象是DOM树中的基本对象。XmlDocument类(它扩展XmlNode)支持用于对整个文档执行操作(例如,将文档加载到内存中或将XML保存到文件)的方法。此外,XmlDocument提供了查看和操作整个XML文档中的节点的方法。XmlNode和XmlDocument都具有性能和可用性增强,并具有进行下列操作的方法和属性:•访问和修改特定于DOM的节点,如元素节点、实体引用节点等。•除检索节点包含的信息(如元素节点中的文本)外,还检索全部节点。注意如果应用程序不需要DOM提供的结构或编辑功能,则XMLReader和XmlWriter类提供对XML的非缓存的只进流访问。有关更多信息,请参见用XmlReader读取XML和用XmlWriter编写XMLNode对象具有一组方法和属性以及基本和定义完善的特性。其中的某些特性包括:•节点有单个父节点,父节点是节点的上一级节点。唯一没有父级的节点是文档根,因为它是顶级节点,包含了文档本身和文档片段。•大多数节点可以有多个子节点,子节点是节点的下一级节点。以下是可以有子节点的节点类型列表。DocumentDocumentFragmentEntityReferenceElementAttributeXMLDeclaration、Notation>Entity、CDATASection、Text、Comment、ProcessingInstruction和DocumentType节点没有子级。•处于同一级别、在关系图中由book和pubinfo节点表示的节点是同辈。DOM的一个特性是它处理属性的方式。属性是不属于父子关系和同辈关系的节点。属性被视为元素节点的属性,由名称和值对组成。例如,如果存在由与元素price关联的format=〃dollar”组成的xML数据,则单词format是名称,format属性的值是dolla匚为检索price节点的format=〃dollar〃属性,可以在游标位于price元素节点时调用GetAttribute。有关更多信息,请参见访问DOM中的属性将XML读入内存时会创建节点。然而,并非所有节点都是同一类型。XML中的元素具有不同于处理指令的规则和语法。因此,在读取各种数据时,将向每个节点分配一种节点类型。此节点类型确定节点的特性和功能。有关在内存中生成的节点类型的更多信息,请参见XML节点类型。有关在节点树中创建的对象的更多信息,请参见将对象层次结构映射到XML数据Microsoft扩展了W3CDOM级别1和级别2中可用的API,使XML文档的使用更容易。在完全支持W3C标准的同时,附加的类、方法和属性增加了使用W3CXMLDOM可以完成的功能以外的功能。新类使您能够访问关系数据,为您提供与ADO.NET数据同步、同时将数据作为XML公开的方法。有关更多信息,请参见使DataSet与XmlDataDocument同步DOM对于将XML数据读入内存以更改其结构、添加或移除节点,或者与元素包含的文本一样修改节点所保存的数据最有用。不过,在其他方案中,还有其他比DOM更快的类。对于对XML的快速非缓存只进流访问,请使用XmlReader和XmlWriter。如果需要用游标模型和XPath进行随机访问,请使用XPathNavigator类。XML节点类型

当将XML文档作为节点树读入内存时,这些节点的节点类型在创建这些节点时确定。XMLDOM具有多种节点类型,这些类型由W3C确定并在1.1.1节“DOM结构模型”中列出。下表列出了节点类型、分配给该节点类型的对象以及每种节点类型的简短说明。DOM节点类型对象说明DocumentXMLDocument类树中所有节点的容器。它也称作文档根,文档根并非总是与根元素相同。DocumentFragmentXmlDocumentFragment类包含一个或多个不带任何树结构的节点的临时袋。DocumentTypeXmlDocumentType类表示<!DOCTYPE...>节点。EntityReferenceXmlEntityReference类表示非扩展的实体引用文本。ElementXmlElement类表示元素节点。AttrXmlAttribute类为元素的属性。ProcessingInstructionXmlProcessingInstruction类为处理指令节点。CommentXmlComment类注释节点。TextXmlText类属于某个元素或属性的文本。CDATASectionXmlCDataSection类表示CDATA。EntityXmlEntity类表示XML文档(来自内部文档类型定义(DTD)子集或来自外部DTD和参数实体)中的<!ENTITY...>声明。NotationXmlNotation类表示DTD中声明的表示法。尽管属性(attr在W3CDOM级别1的1.2节“FundamentalInterfaces'^基本接口)中作为节点列出,但不能将其视为任何元素节点的子级。下表显示了W3C未定义的附加节点类型,但它们可作为XMLNodeType枚举在.NET对象模型中使用。因此,这些节点类型不存在匹配的DOM节点类型列。节点类型说明XMLDecla.ra.tion表示声明节点<?xmlversion=〃1.0〃...>。XmlSignificantWhitespace表示有效空白(混合内容中的空白)。XmlWhitespace表示元素内容中的空白。EndElement当XmlReader到达元素的末尾时返回。示例XML:</item>有关更多信息,请参见XMLNodeType枚举EndEntity由于调用ResolveEntity而在XMLReader到达实体替换的末尾时返回。有关更多信息,请参见Xm®o

deType枚举若要查看读入XML并对代码类型使用case构造以打印有关节点及其内容的信息的代码示例,请参见XmlSignificantWhitespace.NodeType属性有关节点类型及其等效对象名的对象层次结构的更多信息,请参见XML文档对象模型(DOM)层次结构有关在节点树中创建的对象的更多信息,请参见将对象,层次结构映射到XMI数据将对象层次结构映射到XML数据当XML文档在内存中时,概念上的表示形式是树。编程时可使用对象层次结构访问树节点。下面的示例显示XML内容如何成为节点。EndEntity当将XML读入DOM中时,各片段被翻译为节点,这些节点保留有关自身的附加元数据,如它们的节点类型和值。节点类型是节点的对象,它确定可执行的操作以及可设置或检索的属性。如果具有下面的简单XML输入<book><title>TheHandmaid'sTale</title></book>输入在内存中表示为具有分配的节点类型属性的下列节点树:Book和title节点树表示形式XmlElement节点类型XmlElement节点类型book元素成为XMLElement对象,下一个元素title也成为XmlElement,而元素内容成为XmlTheHandmaid's"RileXmiT$xt节点类型Text对象。查看XmlElement的方法和属性可以得知,这些方法和属性不同于TheHandmaid's"RileXmiT$xt节点类型下面的示例读入XML数据并根据节点类型写出不同的文本。将下面的XML数据文件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文件并显示每个节点类型的信息。[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此示例的输出显示数据到节点类型的映射。输出<?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>通过逐行获取输入并使用从代码生成的输出,可以使用下表分析哪个节点测试生成哪些输出行,从而了解哪些XML数据成为哪种节点类型。输入输出节点类型测试输入输出节点类型测试<?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您必须知道分配的节点类型,因为节点类型控制哪种操作有效,以及可以设置和检索哪种属性。当将数据加载到DOM中时,空白的节点创建受PreserveWhitespace标志的控制。有关更多信息,请参见加载DOM时的空白和有效空白处理若要向DOM添加新节点,请参见将节点插入XML文档中。若要从DOM中移除节点,请参见移除XMl文档中的节点、内容和值。若要修改DOM中的节点的内容,请参见修改XMI文档中的节点、内容和值XML文档创建有两种创建XML文档的方法。一种方法是创建不带参数的XmlDocument。另一种方法是创建一个XmIDocument并将XmlNameTable作为参数传递给它。下面的示例显示如何创建一个新的不带参数的空XmlDocument。[VisualBasic]DimdocAsNewXMLDocument()[C#]XmlDocumentdoc=newXmlDocument();创建文档后,可通过Load方法从字符串、流、URL、文本读取器或XMLReader派生类中加载数据到该文档中。还存在另一种加载方法,即LoadXML方法,此方法从字符串中读取XML。有关各种Load方法的更多信息,请参见将XML文档读入DOM有一个名为XMLNameTable的类。此类是原子化字符串对象的表。该表为XML分析器提供了一种高效的方法,即对XML文档中所有重复的元素和属性名使用相同的字符串对象。创建文档时(如上所示),将自动创建XmlNameTable,并在加载此文档时用属性和元素名加载XmlNameTable。如果已经有一个包含名称表的文档,且这些名称在另一个文档中会很有用,则可使用将XmlNameTable作为参数的Load方法创建一个新文档。使用此方法创建文档后,该文档使用现有XmlNameTable,后者包含所有已从其他文档加载到此文档中的属性和元素。它可用于有效地比较元素和属性名。有关XmlNameTable的更多信息,请参见使用XmlNameTable的对象比较。有关参考,请参见XmlNameTable成员将XML文档读入DOMXML信息从不同的格式读入内存。读取源包括字符串、流、URL、文本读取器或XmlReader的派生类。Load方法将文档置入内存中并包含可用于从每个不同的格式中获取数据的重载方法。还存在LoadXML方法,该方法从字符串中读取XML。不同的Load方法将影响在加载DOM时会创建哪些节点。下表列出了一些Load方法的区别以及讲述这些区别的主题。Subject(主题)主题空白节点的创建。用来加载DOM的对象对DOM中生成的空白和有效空白节点有影响。有关更多信息,请参见加载DOM时的空白和有效空白处理从特定节点开始加载XML或加载整个XML文档。使用采用XmlReader为参数的Load方法,可以从一个特定节点加载数据到DOM中。有关更多信息,请参见从读取器中加载数据在加载前验证XML。XmlValidatingReader是唯一派生的XmlReader,它可验证XML。有关更多信息,请参见使用XmlValida.tingReader进行XML验证下面的示例显示用LoadXML方法加载XML然后将数据保存到一个名为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〃);}}嵌入到文档中的样式表指令有时,现有XML会包含<?xml:stylesheet...?>形式的样式表指令。MicrosoftInternetExplorer接受此指令作为<?xml-stylesheet...?>语法的替换形式。当XML数据包含<?xml:stylesheet...?>指令时(如下面的数据所示),试图将此数据加载到DOM中将引发异常。<?XMLversion=〃1.0〃?><?xml:stylesheettype=〃text/xsl〃href=〃test2.xsl〃?><root><test>Node1</test><test>Node2</test></root>发生这种情况是由于<?XML:stylesheet...?>被视为DOM的无效Processinginstruction。根据XML规范中的命名空间,任何Processinginstruction都只能是NCNames(无冒号名称),与QNames(限定名)相反。根据XML规范中的命名空间的第6节,使Load和LoadXml方法符合此规范所产生的影响是,在文档中:•所有元素类型和属性名都应包含零个或一个冒号。•任何实体名称、Processinginstruction目标或表示法名称都不能包含冒号。<?迎:stylesheet...?>包含有一个冒号,违反了上面的第二条规则。根据“将样式表与XML文档关联1.0版”建议(位于/TR/xml-stylesheet),将XSL样式表与XML文档关联的处理指令是<?xml-stylesheet...?>(用短划线代替冒号)。如果使用Load方法和XMLReader参数加载文档,则此行为与从其他格式加载数据时发生的行为有所不同。如果读取器处于初始状态(检查方法是查看ReadState属性是否等于ReadState.Initial),则Load使用读取器中的全部内容并从读取器中的所有数据生成DOM。如果读取器已定位在文档中某个位置的节点上,然后将读取器传递给Load方法,则Load将试图读取当前节点及其所有同辈。直到关闭当前路径的结束标记进入内存中,此操作才完成。Load成功与否取决于加载尝试发生时读取器所在的节点,因为Load验证读取器中的XML的格式是否正确。如果XML的格式不正确,Load将引发异常。例如,下面的节点集包含两个根级别元素,且XML的格式不正确,因此Load引发异常。•Comment节点,后足艮Element节点,后足艮Element节点,后足艮EndElement节点。下面的节点集创建不完整的DOM,原因是没有根级别元素。•Comment节点,后足艮Processinginstruction节点,后足艮Comment节点,后足艮EndElement节点。这不引发异常,并且加载数据。可以向这些节点的顶部添加根元素并创建保存时不会发生错误的格式正确的XML如果读取器定位在对文档的根级别无效的叶节点上(如空白或属性节点),则读取器继续读取,直到定位在一个可用于根的节点上。文档在此时开始加载。默认情况下,Load不使用DTD或架构验证检查XML是否有效。它只检查XML的格式是否正确。为使验证发生,需传入XmlValidatingReader,指定相应的ValidationType并提供ValidationEventHandler。有关XmlValidatingReader的更多信息,请参见使用XmlValidatingReader进彳亍XML验证。有关事件处理的更多信息,请参见使用XmlNodeChangedEventArgs的XML文档中的事件处理在XML加载到DOM中时对其进行验证如果要在加载XML时对照DTD或架构对其进行验证,需要将XmlValidatingReader传递给Load方法。事先必须已将XmlValidatingReader的ValidationType属性设置为ValidationType枚举中某个值(ValidationType.None除外),并且需要提供ValidationEventHandler。在执行此操作的过程中,Load会通知您在加载过程中发现的验证错误。除非ValidationEventHandler停止加载过程,否则,即使发现错误,文档仍会加载到内存中。有关XmlValidatingReader的更多信息,请参见使用XmlValidatingReader进行XML验证将节点插入XML文档中可以通过插入新节点来修改文档。节点可以是新创建的,存在于同一文档中,也可以从另一个文档导入。有关创建新节点的更多信息,请参见在DOM中创建新节点。有关复制现有节点的更多信息,请参见复制现有节点、将现有节点从一个文档复制到另一个文档或复制文档片段在DOM中创建新节点XMLDocument具有用于所有节点类型的Create方法。为该方法提供名称(需要时)以及那些具有内容的节点(如文本节点)的内容或其他参数,这样便可创建节点。下面的方法需要填充名称和几个其他参数以创建相应的节点。CreateCommentCreateCDataSectionCreateDocumentFragmentCreateDocumentTypeCreateElementCreateProcessingInstructionCreateTextNodeCreateXMIDeclarationCreateWhitespaceCreateSignificantWhitespace其他节点类型不仅仅只要求向参数提供数据。有关属性的信息,请参见为DOM中的亓素创建新属性。有关元素和属性名验证的信息,请参见创建新节点时的XML元素和属性名验证。有关如何创建实体引用,请参见创建新实体引用。有关命名空间如何影响实体引用扩展的信息,请参见命名空间对包含元素和属性的新节点的实体引用扩展的影响创建新节点后,有几个方法可用于将其插入到树中。下表列出了这些方法,并描述了新节点在DOM中的位置。方法节点位置InsertBefore插入到引用节点之前。例如,在位置5插入新节点:[VisualBasic]DimrefChildAsXMLNode=node.ChildNodes(4)'Thereferenceiszero-based.node.InsertBefore(newChild,refChild);[C#]XmlNoderefChild=node.ChildNodes

InsertAfterAppendChildPrependChildAppend[4];//Thereferenceiszero-based.node.InsertBefore(newChild,refChild);有关更多信息,请参见XMLNode.InsertBefore方法插入到引用节点之后。例如:[VisualInsertAfterAppendChildPrependChildAppend[4];//Thereferenceiszero-based.node.InsertBefore(newChild,refChild);有关更多信息,请参见XMLNode.InsertBefore方法插入到引用节点之后。例如:[VisualBasic]node.InsertAfter(newChild,refChild)[C#]node.InsertAfter(newChild,refChild);有关更多信息,请参见XMLNode.InsertAfter方法将节点添加到给定节点的子节点列表的末尾。如果所添加的节点是XMLDocumentFragment,则会将文档片段的全部内容移至该节点的子列表中。有关更多信息,请参见XmlNode.AppendChild方法将节点添加到给定节点的子节点列表的开头。如果所添加的节点是XmlDocumentFragment,则会将文档片段的全部内容移至该节点的子列表中。有关更多信息,请参见XmlNode.PrependChild方法将XmlAttribute节点追加到与元素关联的属性集合的末尾。有关更多信息,请参见XmlAttributeCollection.Append方法•获取元素节点并使用SetAttribute将属性添加到该元素的属性集合。•使用CreateAttribute方法创建XMLAttribute节点,获取元素节点,然后使用SetAttributeNode将节点添加到该元素的属性集合。下面的示例显示如何使用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方法创建的新属性。然后显示使用SetAttributeNode方法添加到book元素的属性集合的属性。已知下列XML[VisualBasic,C#]<bookgenre='novel'ISBN=T-861001-57-5'><title>PrideAndPrejudice</title></book>创建一个新属性并为其提供值:[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方法还可以创建一个XMLAttribute节点并使用InsertBefore或InsertAfter方法将其放在集合中的适当位置。如果该属性集合中已存在一个同名属性,则从该集合中移除现有的XmlAttribute节点并插入新的XmlAttribute节点。这与SetAttribute方法执行的方式相同。这些方法(作为参数)将现有节点作为参考点以执行InsertBefore和InsertAfter。如果不提供指示插入新节点位置的引用节点,则InsertAfter方法的默认设置是在集合的开头插入新节点。如果未提供任何引用节点,则InsertBefore的默认位置是集合的末尾。如果创建了属性的XMLNamedNodeMap,则可以使用SetNamedItem方法按名称添加属性。有关更多信息,请参见NamedNodeMap和NodeList中的节点集合默认属性如果创建一个声明为具有默认属性的元素,则DOM创建一个带默认值的新默认属性并将其附加到该元素。此时还创建默认属性的子节点。

属性子节点属性节点的值成为它的子节点。只存在两种类型的有效子节点:XMLText节点和XmlEntityReference节点。从FirstChild和LastChild等方法将这些节点按子节点来处理这一点上说,它们是子节点。当试图移除属性或属性子节点时,属性这种具有子节点的特性很重要。有关更多信息,请参见移除DOM中元素节点的属性复制现有节点DOM中有许多方法和属性可用来选择节点,如SelectSingleNode、ChildNodes[inti]、Attributes[inti]。选择节点后,可以使用适用于特定节点类型的插入方法之一将该节点插入到树中。将节点插入到树中的唯一限制是在插入节点后文档仍必须是格式正确的。将现有节点插入到DOM树中时,该节点从其原始位置移除并添加到它的目标位置。将现有节点从一个文档复制到另一个文档ImportNode方法是将节点或整个节点子树从一个XMLDocument复制到另一个XmlDocument的机制。调用返回的节点是源文档节点的副本,其中包括属性值、节点名、节点类型以及所有与命名空间相关的属性(如前缀、本地名称和命名空间URI)。源文档不更改。导入该节点后,仍需使用插入节点的方法之一将该节点添加到树种。节点附加到它的新文档后,它归此新文档所有。原因是每个节点在创建后都具有所属文档,即使节点是在单独的文档片段中创建的。这是DOM的要求并由XMLDocument类的工厂创建设计强制,例如,CreateElement是创建新节点的唯一方法。根据导入节点的节点类型和deep参数的值,将复制适当的附加信息。此方法尝试镜像当XML片段或HTML源从一个文档复制到另一个文档时的预期行为,以说明一个事实:对于XML,两个文档可能具有不同的DTD。下表描述了可导入的每种节点类型的特定行为。节点类型deep参数为truedeep参数为false

XMLAttributeXmlAttribute.Specified属性在deep参数不适用于XmlAttributeXmlAttribute上设置为true节点类型deep参数为truedeep参数为falseXMLAttributeXmlAttribute.Specified属性在deep参数不适用于XmlAttributeXmlAttribute上设置为true。递节点,因为这些节点在导入时总是携归导入源XmlAttribute的子代,带其子节点。XmlCDataSectionXmlCommentXmlDocumentFragmentXmlDocumentTypeXmlElement并重组结果节点以构成相应的子树。复制该节点,包括复制其数据。复制该节点,包括复制其数据。复制该节点,包括复制其数据。复制该节点,包括复制其数据。递归导入源代码的子代,并重组结创建空的XmlDocumentFragment。果节点以构成相应的子树。复制该节点,包括复制其数据。复制该节点,包括复制其数据。递归导入源元素的子代,并重组结导入源元素的指定属性节点,并将生果节点以构成相应的子树。成的XmlAttribute节点附加到新注意不复制默认属性。如果导入元素。不复制子代节点。到的文档定义该元素名称的默认属注意不复制默认属性。如果导入性,则分配这些默认属性。到的文档定义该元素名称的默认属性,则分配这些默认属性。XmlEntityReference因为源文档和目标文档可能以不同因为源文档和目标文档可能以不同的方式定义实体,所以该方法仅复的方式定义实体,所以该方法仅复制制XmlEntityReference节点。不XmlEntityReference节点。不包括包括替换文本。如果目标文档定义替换文本。如果目标文档定义了实XmlProcessingInstructionXmlTextXmlSignificantWhitespaceXmlWhitespaceXmlDeclaration所有其他节点类型了实体,则给它赋值。从导入的节点复制目标和数据值。复制该节点,包括复制其数据。复制该节点,包括复制其数据。复制该节点,包括复制其数据。从导入的节点复制目标和数据值。不能导入这些节点类型。体,则给它赋值。从导入的节点复制目标和数据值。复制该节点,包括复制其数据。复制该节点,包括复制其数据。复制该节点,包括复制其数据。从导入的节点复制目标和数据值。不能导入这些节点类型。*注意尽管可以导入DocumentType节点,但一个文档只能有一个DocumentType。因此,导入文档类型后,在将其插入到树中之前必须确保文档中没有任何文档类型。有关移除节点的信息,请参见移除XMI文档中的节点、内容和值复制文档片段可以创建一个XMLDocumentFrament节点,然后在它下面添加节点。当使用InsertNode方法插入XmlDocumentFragment时,不复制XmlDocumentFrament节点,但在DOM中插入它的子节点。移除XML文档中的节点、内容和值DOM在内存中之后,可以移除树中的节点,或移除特定节点类型中的内容和值。有关如何从文档中移除叶节点或整个节点子树的信息,请参见从DOM中移除节点。有关如何移除元素属性的信息,请参见移除DOM中亓素节点的属性。有关如何移除节点内容但将节点保留在树中的信息,请参见移除DOM中的节点内容从DOM中移除节点若要从DOM中移除节点,请使用RemoveChild方法移除特定节点。移除节点时,此方法移除属于所移除的节点的子树(即如果它不是叶节点)。若要从DOM中移除多个节点,请使用RemoveAll方法移除当前节点的所有子级和属性(如果适用)。如果使用XMLNamedNodeMap,则可以使用RemoveNamedItem方法移除节点。若要移除属性,请参见移除DOM中元素节点的属性移除DOM中元素节点的属性有多种方法可以移除属性。一种方法是从属性集合中移除它们。为此,请执行下列步骤:使用XMLAttributeCollectionattrs=elem.Attributes;获取元素的属,性集合。使用以下三种方法之一移除属性集合中的属性:使用XMLAttributeCollection.Remove方法移除特定属性。使用XMLAttributeCollection.RemoveAll方法移除集合中的所有属性,使元素不具有任何属性。使用XMLAttributeCollection.RemoveAt方法移除属性集合中的属性(通过使用其索引号)。下列方法移除元素节点中的属性。•使用XMLElement.RemoveAllAttributes移除属性集合。•使用XMLElement.RemoveAttribute方法按名称移除集合中的单个属性。•使用XMLElement.RemoveAttributeAt按索引号移除集合中的单个属性。另一个替换方法是获取元素,获取属性集合中的属性并直接移除属性节点。若要获取属性集合中的属性,可使用名称XMLAttributeattr=attrs[〃attr_name〃];、索弓|XmlAttributeattr=attrs[0];或用命名空间XmlAttributeattr=attrs[〃attr_localName〃,"attr_namespace〃]完全限定该名称。无论用于移除属性的方法是什么,当移除在DTD中定义为默认属性的属性时有特殊限制。除非移除了默认属性所属的元素,否则不能移除默认属性。已声明了默认属性的元素总是存在默认属性。移除XMLAttributeCollection或XmlElement中的默认属性可导致将替换属性插入到元素的XmlAttributeCollection中,并初始化为已声明的默认值。如果将某个元素定义为<bookatt[="1"att2="2"att3="3"></book>,则将得到一个具有三个已声明的默认属性的book元素。DOM实现保证只要此book元素存在,它就具有这三个默认属性:att1、att2和att3。当用XMLAttribute调用时,RemoveAll将该属性值设置为String.Empty,因为属性没有值便无法存在。移除DOM中的节点内容对于从XMLCharacterData继承的节点类型(即XmlComment、XmlText、XmlCDataSection、XmlWhitespace和XmlSignificantWhitespace节点类型),可以使用DeleteData方法移除字符,此方法从节点中移除某个范围的字符。如果要完全移除内容,则移除包含此内容的节点。如果要保留节点,但节点内容不正确,则修改内容。有关修改节点内容的信息,请参见修改XML文档中的节点、内容和值修改XML文档中的节点、内容和值有多种方法可以修改文档中的节点和内容。您可以:•使用XMLNode.Value方法更改节点值。•通过用新节点替换节点来修改全部节点集。这可使用XMLNode.InnerXml属性完成。•使用XMLNode.ReplaceChild方法用新节点替换现有节点。•使用XMLCharacterData.AppendData方法、XmlCharacterData.InsertData方法或XmlCharacterData.ReplaceData方法将附加字符添加到从XmlCharacter类继承的节点。•对从XMLCharacterData继承的节点类型使用DeleteData方法移除某个范围的字符来修改内容。使用SetAttribute方法更新属性值。如果不存在属性,SetAttribute创建一个新属性;如果存在属性,则更新属性值。更改节点值的一个简单方法是使用node.Vame="newva^e”;。下表列出了此单个代码行作用于的节点类型,以及对于该节点类型将更改的确切数据。节点类型更改的数据Attribute属性的值。CDATASectionCDATASection的内容。Comment注释的内容。Processinginstruction内容(不包括目标)。Text文本的内容。XMLDeclarationWhitespace声明的内容(不包括<?xml和?>标记)。空白的值。可以将该值设置为四个可识别的XML空白字符之一:空格、制表符、回车或换行。SignificantWhitespace有效空白的值。可以将该值设置为四个可识别的XML空白字符之一:空格、制表符、回车或换行。该表中未列出的任何节点类型都不是设置了值的有效节点类型。设置任何其他节点类型的值都将引发InvalidOperationException。InnerXML属性更改当前节点的子节点标记。设置此属性将用给定字符串的分析内容替换子节点。分析在当前命名空间上下文中执行。此外,InnerXml移除多余的命名空间声明。因此,大量的剪切和粘贴操作并不会使文档的大小因多余的命名空间声明而增加。有关显示命名空间对InnerXml操作的影响的代码示例,请参见XmlDocument.InnerXml属性当使用ReplaceChild和RemoveChild方法时,这两个方法返回已替换或移除的节点。然后,此节点可以重新插入到DOM中的其他位置。ReplaceChild方法对插入到文档中的节点执行两个验证检查。第一个检查确保该节点成为某个节点的子级,这个节点可具有其类型的子节点。第二个检查确保插入的节点不是它成为其子级的节点的上级。违犯这两个条件中的任何一个都将引发InvalidOperationException异常。向可编辑的节点中添加或从中移除只读子级是有效的。然而,试图修改只读节点本身将引发InvalidOperationException异常。修改XMLEntityReference节点的子级便属于这种情况。该子级是只读的,因此无法修改。任何修改它们的尝试都将引发InvalidOperationException。保存和写出文档当加载并保存XMLDocument时,所保存的文档在下列方面可能与原始文档存在差异:•如果在调用Save方法前将PreserveWhitespace属性设置为true,则在输出中将保留文档中的空白;否则,如果此属性为false,XMLDocument会自动缩进输出。•各个属性之间的所有空白都缩减为一个空白字符。•更改元素间的空白。保留有效空白,但不保留无效空白。但是,当保存文档时,文档在默认情况下将使用XMLTextWriterIndenting模式整齐地打印输出,以使其更易于阅读。•属性值两边所用的引号字符在默认情况下更改为双引号。可以使用XMLTextWriter的QuoteChar属性将引号字符设置为双引号或单引号。•默认情况下,保留像&abc;这样的常规实体。但如果构造一个具有ExpandEntities的默认EntityHandling设置的XMLValidatingReader,然后调用Load,则常规实体将被扩展,从而丢失已保存文档中的常规实体。•默认情况下,扩展像{这样的数字字符实体。•不保留输入文档中的字节顺序标记。除非显式创建指定不同编码的XML声明,否则UCS-2保存为UTF-8。•如果要将XMLDocument写出到文件或流中,则写出的输出与文档内容相同。也就是说,仅当文档中包含XmlDeclaration时才写出XmlDeclaration,并且写出文档时所使用的编码与声明节点中给定的编码相同。写出XMLDeclaration除了Save和WriteContentTo的XMLDocument方法外,OuterXml、InnerXml和WriteTo的XmlDocument和XmlDeclaration方法也创建XML声明。对于OuterXML、InnerXml的XmlDocument方法以及Save(Streamstm)、Save(Stringfilename)>WriteTo和WriteConentTo方法,在XML声明中写出的编码是从XmlDeclaration节点中获取的。如果不存在XmlDeclaration节点,则不写出XmlDeclaration。如果XmlDeclaration节点中没有编码,则在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方法,如果未设置Encoding属性,则不写出任何编码。否则,在XML声明中写出的编码与Encoding属性中的编码相同。用OuterXML属性写出文档内容OuterXML属性是Microsoft对W3C文档对象模型标准的扩展。OuterXml属性用于获取整个XML文档的标记,或只获取单个节点及其子节点的标记。OuterXml返回表示给定节点及其所有子节点的标记。下面的代码示例显示了如何将整个文档保存为一个字符串。[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;与此相反,如果您需要子节点的内容,可以使用InnerText属性。OuterXML属性有一个方面影响它从文档中生成的输出,例如,当您在XML中将一个元素定义为EntityReference节点时。在DTD中,您已用一个默认属性定义了该元素。OuterXml属性不写出该元素的默认属性。例如,假定已声明了下面这一常规实体,替换文本在一个称为013.ent的文件中,如下所示:013.ent<e/>例如,下面这一称为X_Entity.XML的XML中包含一个DTD,其元素定义为具有默认属性: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数据:<doc><ea1="a1default"a2="a2default"/></doc>然而,在使用OuterXML属性时,实际的输出是:输出<!DOCTYPEdoc[<!ELEMENTdoc(e)><!ELEMENTe(#PCDATA)><!ATTLISTea1CDATA"a1default"a2NMTOKENS"a2default"><!ENTITYxSYSTEM"013.ent">]><doc><e/></doc>—AttributeCount2下面的代码用来测试默认属性并显示不包含DTD中定义的默认属性的输出。[VisualBasic]ImportsSystemImportsSystem.DataImportsSystem.XMLImportsSystem.Xml.XPathImportsSystem.Runtime.RemotingNamespaceTestSimplePub

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论