基于DOM的XML文件操作
InnerXML返回XmlNode它内部的所有节点构成的Xml片段。对于含有命名空间的元素作以下方式处理。
InnerText返回内部文本部分。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template >
...
</xsl:template>
</xsl:stylesheet>
样式表节点上的 InnerXml 属性返回以下字符串:
<xsl:template xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> ... </xsl:template>
假定父 xsl:stylesheet 元素已经具有 xmlns:xsl 命名空间声明, InnerXml 将识别出该 xmlns:xsl 命名空间声明是冗余的,因此将其移除。
如果您将 InnerXml 从一个没有默认命名空间的文档移动到一个具有默认命名空间的文档,则行为稍微有所不同。
请考虑下面的 XML 字符串:
<test> <item>123</item> </test>
InnerXml 返回无格式的 XML 字符串,不带有命名空间声明:
<item>123</item>
如果随后将该字符串插入一个具有默认命名空间的文档,例如下面的情况:
<test2 xmlns="urn:1"> </test>
InnerXml 在上下文中分析该字符串,新节点选取 urn:1 命名空间。
结果看起来如下:
<test2 xmlns="urn:1"> <item>123</item> </test>
当请求 InnerXml 时,您得到以下结果:
<item xmlns="urn:1">123</item>
如果您明确要求插入的项保留它来自于一个不具有命名空间的文档这一事实,则需要手动添加 xmlns= "" 声明并插入结果字符串:
<item xmlns="">123</item>
XmlDocumnet为所有的节点类型提供了创建方法,包括:CreateCDataSeCtion,CreateComment,CreateDocumnetFragment,CreateDocumentType,CreateElement,CreateNode,
CreateProcessingInstrucion,CreateSingleWhiteSpace,CreateTextNode,CreateWhiteSpace和CreateXmlDeclaration.
创建节点以后可以使用以下几种方式将其添加到树中:
InsertBefore, InsertAfter,AppendChild,PerpendChild和Append.
XmlDocument类的ImportNode可以将节点从一个XmlDocument对象复制到另一个对象而不会改变原文档,之后可以使用一种插入方式将它插入到目标文档中。
演示代码如下:
Xml文档对象模型(DOM)在内存中之后,可以移除树中的节点,或移除特定节点类型中的内容和值。
1 using System; 2 using System.Xml; 3 4 namespace ImportXml 5 { 6 class Program 7 { 8 public static void Main(string[] args) 9 { 10 XmlDocument doc1=new XmlDocument(); 11 doc1.LoadXml("<book><title>红楼梦</title></book>"); 12 //创建一个新的元素节点 13 XmlElement xem=doc1.CreateElement("price"); 14 //创建属性 15 XmlAttribute att1=doc1.CreateAttribute("format"); 16 //给属性赋值 17 att1.Value="RMB"; 18 //将属性赋予元素的节点 19 xem.SetAttributeNode(att1); 20 //创建文本 21 XmlText text=doc1.CreateTextNode("20"); 22 //将文本添加到指定的元素 23 xem.AppendChild(text); 24 //将新建的元素添加到XML对象中 25 doc1.DocumentElement.AppendChild(xem); 26 XmlDocument doc2=new XmlDocument(); 27 doc2.LoadXml("<author>曹雪芹</author>"); 28 //将节点从另一个文档导入到当前文档。 29 XmlNode newNode=doc1.ImportNode(doc2.DocumentElement,true); 30 doc1.DocumentElement.AppendChild(newNode); 31 doc1.Save(@"D:/hlm1.xml"); 32 Console.Write("Press any key to continue "); 33 Console.ReadKey(true); 34 } 35 } 36 }
《1》移除节点方法:
- 使用RemoveChild方法移除特定的节点,在移除的同时将移除节点的子树。
- 使用RemoveAll方法移除当前节点的所有子级和属性。
《2》移除属性集合中的属性的方法:(使用XmlAttributeCollection atts= xem.Attributes;获取元素的属性集合)
- 使用Remove移除特定的属性。
- 使用RemoveAll移除集合中的所有属性并保留没有属性的元素
- 使用RemoveAt通过索引号从属性集合中移除属性。
《3》移除元素节点中的属性
- 使用RemoveAllAttributes移除属性集合
- 使用RemoveAttribute按名称从集合中移除单个的属性。
- 使用RemoveAttributeAt按索引从集合中移除单个的属性。
移除在文档类型定义(dtd)中定义为默认属性的属性时有特殊的限制,除非移除默认的属性所属的元素,否则不认移除默认属性。
在使用XmlAttribute调用时,RemoveAll方法将属性的值设置为Empty,因为不能存在没有值得属性。
1 using System; 2 using System.Xml; 3 4 namespace ImportXml 5 { 6 class Program 7 { 8 public static void Main(string[] args) 9 { 10 XmlDocument doc1=new XmlDocument(); 11 doc1.LoadXml(" <book><title>红楼梦</title> <price format=\"RMB\">20</price> <author>曹雪芹</author> </book>"); 12 //获取根元素 13 XmlElement root=doc1.DocumentElement; 14 //根元素上的子节点列表 15 XmlNodeList nodes=root.ChildNodes; 16 //获取第二个元素 17 XmlElement e2=nodes[1] as XmlElement; 18 //删除其名为format的属性 19 e2.RemoveAttribute("format"); 20 //获取第二个元素的子节点列表 21 XmlNodeList ns=e2.ChildNodes; 22 //将第一个节点的文本值改为25 23 ns[0].Value="25"; 24 //删除XML片段的第一个元素 25 root.RemoveChild(root.FirstChild); 26 doc1.Save(@"D:/hlm2.xml"); 27 28 Console.ReadKey(true); 29 } 30 } 31 }