【C# XML】 System.Xml类

命名空间的整体结构

xml的解析方式有两种:1、基于dom对象文档模型,将文件装入内存中 在内存中形成一棵树,然后对这个树进行显示或操作。2、sax流模型 是一种顺序的解析方式,基于事件,他从文件的第一行开始解析一直到文件的末尾。解析一行头节点发生事件,然后执行回调函数,然后再回调函数中解析这个节点。 它直接一行一行的读取文件中的 xml,内存中只保存当前行,因此不占用内存,

 

 

 

 

新建XmlDocument()方法

方法一:new  XmlDocument();new  XmlDocument(XmlImplementation imp);new  XmlDocument(XmlNameTable)

方法二:XmlImplementation实例创建一个有共同上下文的xml文档,内部有一个XmlNameTable

       XmlImplementation xmlImplementation = new XmlImplementation();
       XmlDocument doc1= xmlImplementation.CreateDocument();
       XmlDocument doc2 = xmlImplementation.CreateDocument();//doc2和doc1有共同的XmlNameTable ,方便比较两个文档。
//相当于new XmlDocument(XmlImplementation imp) ;

 

XmlDocument 新建一个文档

  XmlDocument xmldoc = new XmlDocument();
        XmlImplementation impl = new XmlImplementation();
        XmlDocument doc2 = impl.CreateDocument();
        XmlDeclaration declaration =doc2.CreateXmlDeclaration("1.0",null,null);
     


        //添加一个新节点
        XmlElement root = doc2.CreateElement("Books");
        XmlElement decendant = doc2.CreateElement("Book");
        XmlElement decendant2 = doc2.CreateElement("Title");

        //添加属性
        root.SetAttribute("name", "root");

        //修改属性
        decendant2.InnerText = "zhanyuhepin";

        //添加克容节点
        decendant.AppendChild(decendant2);
        root.AppendChild(decendant);
        doc2.AppendChild(root);

        //添加xml 声明
        doc2.InsertBefore(declaration, root);
        doc2.Save("books.xml");
    

NameTable\XmlNameTable


XmlReaderSettings 、XmlNamespaceManager、XmlDocument有NameTable,XmlImplementation内部有XmlNameTable。
有些类(如 XmlDocument 和 XmlReader)在内部使用 NameTable 类存储属性名和元素名。 当 XML 文档中多次出现某个元素名或特性名时,该名称在 NameTable 中只存储一次。
例如:

XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"Books.xml");
//Books.xml包含以下内容:
<bookstore xmlns:sp="http://example.books.com"> <book genre="autobiography" publicationdate="1991" ISBN="1-861003-11-0">

xmldoc种的nametable就会存储 bookstore、sp、http://example.books.com、genre 。

管理命名空间:XmlNamespaceManager

XmlNamespaceManager类存储命名空间 URI 及其前缀的集合,您可在此集合中查找、添加和删除命名空间。 在某些上下文中,需要使用此类以获得更佳 XML 处理性能。 例如,XsltContext 类、 XmlDocument.SelectNodes方法使用 XmlNamespaceManager 以获得 XPath 支持。XmlDocument使用XmlNamespaceManager管理命名空间。lingXDocument不使用XmlNamespaceManager管理命名空间。

命名空间管理器对命名空间不执行任何验证,而是假定前缀和命名空间已经过验证并符合 W3C 命名空间规范。

下面是可使用 XmlNamespaceManager 类执行的一些管理和查找任务。 有关更多信息和示例,请遵循指向每个方法或属性的引用页的链接。

功能使用
添加命名空间 AddNamespace 方法
移除命名空间 RemoveNamespace 方法
查找默认命名空间的 URI DefaultNamespace 属性
查找命名空间前缀的 URI LookupNamespace 方法
查找命名空间 URI 的前缀 LookupPrefix 方法
获取当前节点中命名空间的列表 GetNamespacesInScope 方法需要XmlNamespaceScope枚举做参数
限定命名空间的范围 PushScopePopScope 方法
检查是否在当前范围内定义了前缀 HasNamespace 方法
获取用于查找前缀和 URI 的名称表 NameTable 属性

应用实例

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.Load(@"Books.xml");
        XmlNameTable nameTable = xmldoc.NameTable;
        XmlNamespaceManager xmlns = new XmlNamespaceManager(xmldoc.NameTable);
   
        xmlns.AddNamespace("sd", "http://example.books.com");//默认的命名空间也要添加 前缀
        xmlns.AddNamespace("sp",   "http://example.book.com");
        XmlNodeList nodelist = xmldoc.SelectNodes("/sd:bookstore/sp:book", xmlns);

        XmlNodeList nodelist = xmldoc.SelectNodes("//*[local-name()='bookstore']");  这将选择名称为 Section 的所有元素,而不管它们的命名空间。
//*[local-name()='Section' and namespace-uri()='http://www.siemens.com/automation/Openness/SW/Interface/v1'] 很多处理xpath的工具也有注册命名空间的方法,然后就可以使用像这样的限定形式


local-name() 是 xpath函数

 

Books.xml

 

<?xml version="1.0" encoding="utf-8" ?>
<bookstore xmlns="http://example.books.com">
  <book genre="autobiography" publicationdate="1991" ISBN="1-861003-11-0">
    <title>The Autobiography of Benjamin Franklin</title>
    <author>
      <first-name>Benjamin</first-name>
      <last-name>Franklin</last-name>
    </author>
    <price>8.99</price>
  </book>
  <sp:book genre="novel" publicationdate="1967" ISBN="0-201-63361-2" xmlns:sp="http://example.book.com">
    <title>The Confidence Man</title>

    <author>
      <first-name>Herman</first-name>
      <last-name>Melville</last-name>
    </author>
    <price>11.99</price>
  </sp:book>
  <book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
    <title>The Gorgias</title>
    <author>
      <name>Plato</name>
    </author>
    <price>9.99</price>
  </book>
</bookstore>
 

读取一个xml片段

string xmlFrag ="<item rk:ID='abc-23'>hammer</item> " +
                        "<item rk:ID='r2-435'>paint</item>" +
                        "<item rk:ID='abc-39'>saw</item>";

// Create the XmlNamespaceManager.
NameTable nt = new NameTable();
XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt);
nsmgr.AddNamespace("rk", "urn:store-items");

// Create the XmlParserContext.
XmlParserContext context = new XmlParserContext(null, nsmgr, null, XmlSpace.None);

// Create the reader.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(new StringReader(xmlFrag), settings, context);

 

posted @ 2022-04-28 22:10  小林野夫  阅读(648)  评论(0编辑  收藏  举报
原文链接:https://www.cnblogs.com/cdaniu/