zoukankan      html  css  js  c++  java
  • c#(.Net)解析xml

    1、一般处理

    复制代码
        XmlDocument xmlDoc = new XmlDocument();  
        xmlDoc.LoadXml("<?xml version="1.0" encoding="utf-8"?><HH><CODE>11</CODE><NAME>kkkk</NAME></HH>");  
        XmlNode rootNode = xmlDoc.SelectSingleNode("HH");  
        foreach (XmlNode xxNode in rootNode.ChildNodes)  
        {  
            string dsf = xxNode.InnerText;  
            string sdf = xxNode.Name;  
        }  
    复制代码

    2、利用DataTable

    复制代码
        DataSet dsData = new DataSet();  
        dsData.ReadXml(new XmlTextReader(new StringReader("<?xml version="1.0" encoding="utf-8"?><HH><CODE>11</CODE><NAME>kkkk</NAME></HH>")));  
        DataTable dt = dsData.Tables["HH"];  
          
          
        foreach (DataRow dr in dt.Rows)  
        {  
            foreach (DataColumn dc in dr.Table.Columns)  
            {  
                string n = dc.ColumnName;  
                string value = dr[n].ToString();  
             }  
        }  
    复制代码

    3、带有命名空间(NameSpace)的XML文本解析

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <bookstore xmlns="http://www.lucernepublishing.com"
               xml:base="http://www.semanticweb.org/ontologies/2012/2/OntologyMinePower.owl">
      <book>
        <title>C语言</title>
        <author name ="XIAO">
          <age>25</age>
        </author>
        <price>50</price>
      </book>
      <book>
        <title>数据库</title>
        <price>100</price >
      </book >
      <book>
        <title>数据结构</title>
        <age>100</age>
        <author name ="Wang">
          <age>25</age>
          <sex>female</sex>
        </author>
        <price>66.5</price >
      </book >
    </bookstore>
    复制代码
    复制代码
    private void button1_Click(object sender, EventArgs e)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(@"....CD.xml");
    
                XmlElement root = null;
                root = doc.DocumentElement;
    
                XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
                nsmgr.AddNamespace("ab", "http://www.lucernepublishing.com");
               
                XmlNodeList listNodes = null;
                listNodes = doc.SelectNodes("/ab:bookstore/ab:book[ab:author[ab:sex]]/ab:price", nsmgr);
                foreach (XmlNode node in listNodes )
                {
                    richTextBox1.Text += node.InnerText + "
    ";
                }
            }
    复制代码

    该XPath语言的意思是查询bookstore下的所有带有author节点,并且author节点带有sex节点的book节点的price子节点。其结果是66.5

    对于有命名空间的XML文本的解析,只需调用XmlNode.SelectNodes的不同的重载函数,赋予XmlNamespaceManager参数,并相应调整XPath语句即可。

    详细参考

    1.这里我参照MSDN给出一个XML源文件,为了显示不同的效果,XML结构在逻辑上并不合理

    复制代码
    <?xml version="1.0" encoding="utf-8" ?>
    <bookstore>
      <book>
        <title>C语言</title>
        <author name ="XIAO">
          <age>25</age>
        </author>
        <price>50</price>
      </book>
      <book>
        <title>数据库</title>
        <price>100</price >
      </book >
      <book>
        <title>数据结构</title>
        <age>100</age>
        <author name ="Wang">
          <age>25</age>
          <sex>female</sex>
        </author>
        <price>66.5</price >
      </book >
    </bookstore>
    复制代码

    2.简单示例

    复制代码
    private void button1_Click(object sender, EventArgs e)
            {
                XmlDocument doc = new XmlDocument();
                doc.Load(@"....CD.xml");
    
                XmlElement root = null;
                root = doc.DocumentElement;
    
                XmlNodeList listNodes = null;
                listNodes = root.SelectNodes("/bookstore/book/price");
                foreach (XmlNode node in listNodes )
                {
                    richTextBox1.Text += node.InnerText + "
    ";
                }
            }
    复制代码

    这里 listNodes=root.SelectNodes("/bookstore/book/price");意思是选取所有符合bookstore——>book——>price层级关系的price节点

    效果如下图:

    3.XPath详解

     1)"/bookstore/book/price"

    XPath的开头是一个斜线(/)代表这是绝对路径,这可以选出所有路径符合这个模式的元素。这代表选出所有bookstore根节点下的book元素下的price元素。

    2)"//title"

    开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。这代表选出所有title元素。

    3)"/bookstore/book/author/*"

    使用星号(*)可以选择未知的元素。这代表选出bookstore根节点下的book节点下的anthor节点下的所有可能的节点。

    得到的结果:25 25 female

    4)"/bookstore/book/*/age"

    上面的语法会选出所有bookstore根节点下的book节点的隔一个层次的age节点。

    得到的结果为:25 25

    5)"/*/*/age"

    选取有两个层级的age元素,得到的结果为:100

    要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。

    6)"bookstore/book[1]/title"

     使用中括号可以选择分支。这代表选择bookstore根节点下第一个book节点的title节点。

    得到的结果为:C语言

    7)"bookstore/book[last()]/title"

     同样,这里表示选择最后一个节点,得到的结果是:数据结构

    8)"bookstore/book/author[sex]"

    这里表示选取所有带有sex元素并满足一定层次结构的author节点,得到的结果是:25female

    9)"/bookstore/book[price=66.5]/title"

     选取price元素值是66.5的book节点的title子节点,得到的结果是:数据结构

    10)"/bookstore/book/title | /bookstore/book/price"

     使用Or操作数(|)就可以选择一个以上的路径。这里表示选取符合一定层次结构的title元素与price元素

    其结果是:C语言 50 数据库 100 数据结构 66.5

     11)"//@name"

    XPath中,除了选择元素以外,也可以选择属性,属性都是以@开头。这里表示选取所有的name属性。

    其结果是:XIAO Wang

     12)"//author[@name]/age"

    这里表示选取所有具有name属性的author节点的age节点。其结果是:25 25

    13)"//*[@*]"

    选取所有有属性的节点。其结果是:25 25female

    14)"//author[@name='Wang']/sex"

    选取所有属性name值为Wang的author节点的sex子节点。其结果是:female

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/9187482.html
Copyright © 2011-2022 走看看