亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

在C#中使用XML指南之讀取XML

2024-09-05 20:55:45
字體:
來源:轉載
供稿:網友
對于xml,想必各位都比較了解,我也就不用費筆墨來描述它是什么了,我想在未來的中xml一定會大放異彩,xml是可擴展標記語言,使用它企業可以制定一套自己的數據格式,數據按照這種格式在網絡中傳輸然后再通過xslt將數據轉換成用戶期望的樣子表示出來,這樣便輕易的解決了數據格式不兼容的問題。用于internet的數據傳輸,我想,這是xml對于我們這些程序員最誘人的地方!

  我們今天的主題不是論述xml的好處,而是討論在c#中如何使用xml。下面我們來了解一下使用程序訪問xml的一些基礎理論知識。

  訪問的兩種模型:

  在程序中訪問進而操作xml文件一般有兩種模型,分別是使用dom(文檔對象模型)和流模型,使用dom的好處在于它允許編輯和更新xml文檔,可以隨機訪問文檔中的數據,可以使用xpath查詢,但是,dom的缺點在于它需要一次性的加載整個文檔到內存中,對于大型的文檔,這會造成資源問題。流模型很好的解決了這個問題,因為它對xml文件的訪問采用的是流的概念,也就是說,任何時候在內存中只有當前節點,但它也有它的不足,它是只讀的,僅向前的,不能在文檔中執行向后導航操作。雖然是各有千秋,但我們也可以在程序中兩者并用實現優劣互補嘛,呵呵,這是題外話了!我們今天主要討論xml的讀取,那我們就詳細討論一下流模型吧!

  流模型中的變體:

  流模型每次迭代xml文檔中的一個節點,適合于處理較大的文檔,所耗內存空間小。流模型中有兩種變體——“推”模型和“拉”模型。

  推模型也就是常說的sax,sax是一種靠事件驅動的模型,也就是說:它每發現一個節點就用推模型引發一個事件,而我們必須編寫這些事件的處理程序,這樣的做法非常的不靈活,也很麻煩。

  .net中使用的是基于“拉”模型的實現方案,“拉”模型在遍歷文檔時會把感興趣的文檔部分從讀取器中拉出,不需要引發事件,允許我們以編程的方式訪問文檔,這大大的提高了靈活性,在性能上“拉”模型可以選擇性的處理節點,而sax每發現一個節點都會通知客戶機,從而,使用“拉”模型可以提高application的整體效率。在.net中“拉”模型是作為xmlreader類實現的,下面看一下該類的繼承結構:


  我們今天來講一下該體系結構中的xmltextreader類,該類提供對xml文件進行讀取的功能,它可以驗證文檔是否格式良好,如果不是格式良好的xml文檔,該類在讀取過程中將會拋出xmlexception異常,可使用該類提供的一些方法對文檔節點進行讀取,篩選等操作以及得到節點的名稱和值,請牢記:xmltextreader是基于流模型的實現,打個不恰當的比喻,xml文件就好象水源,閘一開水就流出,流過了就流過了不會也不可以往回流。內存中任何時候只有當前節點,你可以使用xmltextreader類的read()方法讀取下一個節點。好了,說了這么多來看一個例子,編程要注重實際對吧??创a前先看下運行效果吧!


  example1按紐遍歷文檔讀取數據,example2,example3按紐得到節點類型,example4過濾文檔只獲得數據內容,example5得到屬性節點,example6按紐得到命名空間,example7顯示整個xml文檔,為此,我專門寫一個類來封裝以上功能,該類代碼如下:


//---------------------------------------------------------------------------------------------------
//xmlreader類用于xml文件的一般讀取操作,以下對這個類做簡單介紹:
//
//attributes(屬性):
//listbox: 設置該屬性主要為了得到客戶端控件以便于顯示所讀到的文件的內容(這里是listbox控件)
//xmlpath: 設置該屬性為了得到一個確定的xml文件的絕對路徑
//
//basilic using(重要的引用):
//system.xml: 該命名空間中封裝有對xml進行操作的常用類,本類中使用了其中的xmltextreader類
//xmltextreader: 該類提供對xml文件進行讀取的功能,它可以驗證文檔是否格式良好,如果不是格式 // 良好的xml文檔,該類在讀取過程中將會拋出xmlexception異常,可使用該類提供的
// 一些方法對文檔節點進行讀取,篩選等操作以及得到節點的名稱和值
//
//bool xmltextreader.read(): 讀取流中下一個節點,當讀完最后一個節點再次調用該方法該方法返回false
//xmlnodetype xmltextreader.nodetype: 該屬性返回當前節點的類型
// xmlnodetype.element 元素節點
// xmlnodetype.endelement 結尾元素節點
// xmlnodetype.xmldeclaration 文檔的第一個節點
// xmlnodetype.text 文本節點
//bool xmltextreader.hasattributes: 當前節點有沒有屬性,返回true或false
//string xmltextreader.name: 返回當前節點的名稱
//string xmltextreader.value: 返回當前節點的值
//string xmltextreader.localname: 返回當前節點的本地名稱
//string xmltextreader.namespaceuri: 返回當前節點的命名空間uri
//string xmltextreader.prefix: 返回當前節點的前綴
//bool xmltextreader.movetonextattribute(): 移動到當前節點的下一個屬性
//---------------------------------------------------------------------------------------------------

namespace xmlreading
{
 using system;
 using system.xml;
 using system.windows.forms;
 using system.componentmodel;

 /// <summary>
 /// xml文件讀取器
 /// </summary>

 public class xmlreader : idisposable
 {
  private string _xmlpath;
  private const string _errmsg = "error occurred while reading ";
  private listbox _listbox;
  private xmltextreader xmltxtrd;

  #region xmlreader 的構造器

  public xmlreader()
  {
   this._xmlpath = string.empty;
   this._listbox = null;
   this.xmltxtrd = null;
  }

  /// <summary>
  /// 構造器
  /// </summary>
  /// <param name="_xmlpath">xml文件絕對路徑</param>
  /// <param name="_listbox">列表框用于顯示xml</param>

  public xmlreader(string _xmlpath, listbox _listbox)
  {
   this._xmlpath = _xmlpath;
   this._listbox = _listbox;
   this.xmltxtrd = null;
  }

  #endregion
  #region xmlreader 的資源釋放方法

  /// <summary>
  /// 清理該對象所有正在使用的資源

  /// </summary>

  public void dispose()
  {
   this.dispose(true);
   gc.suppressfinalize(this);
  }

  /// <summary>
  /// 釋放該對象的實例變量
  /// </summary>
  /// <param name="disposing"></param>

  protected virtual void dispose(bool disposing)
  {
   if (!disposing)
    return;
   if (this.xmltxtrd != null)
   {
    this.xmltxtrd.close();
    this.xmltxtrd = null;
   }

   if (this._xmlpath != null)
   {
    this._xmlpath = null;
   }
  }

  #endregion 
  #region xmlreader 的屬性

  /// <summary>
  /// 獲取或設置列表框用于顯示xml
  /// </summary>

  public listbox listbox
  {
   get
   {
    return this._listbox;
   }
   set
   {
    this._listbox = value;
   }
  }

  /// <summary>
  /// 獲取或設置xml文件的絕對路徑
  /// </summary>

  public string xmlpath
  {
   get
   {
    return this._xmlpath;
   }
   set
   {
    this._xmlpath = value;
   }
  }

  #endregion

  /// <summary>
  /// 遍歷xml文件
  /// </summary>

  public void eachxml()
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);

   try
   {
    while(xmltxtrd.read())
    {
     this._listbox.items.add(this.xmltxtrd.value);
    }
   }
   catch(xmlexception exp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + exp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 讀取xml文件的節點類型
  /// </summary>

  public void readxmlbynodetype()
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);

   try
   {
    while(xmltxtrd.read())
    {
     this._listbox.items.add(this.xmltxtrd.nodetype.tostring());
    }
   }
   catch(xmlexception exp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + exp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 根據節點類型過濾xml文檔
  /// </summary>
  /// <param name="xmlntype">xmlnodetype 節點類型的數組</param>

  public void filterbynodetype(xmlnodetype[] xmlntype)
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);
   try
   {
    while(xmltxtrd.read())
    {
     for (int i = 0; i < xmlntype.length; i++)
     {
      if (xmltxtrd.nodetype == xmlntype[i])
      {
       this._listbox.items.add(xmltxtrd.name + " is type " + xmltxtrd.nodetype.tostring());
      }
     }
    }
   }
   catch(xmlexception exp)
   {
    throw new xmlexception(_errmsg + this.xmlpath + exp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 讀取xml文件的所有文本節點值

  /// </summary>

  public void readxmltextvalue()
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);

   try
   {
    while(xmltxtrd.read())
    {
     if (xmltxtrd.nodetype == xmlnodetype.text)
     {
      this._listbox.items.add(xmltxtrd.value);
     }
    }
   }
   catch(xmlexception xmlexp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + xmlexp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 讀取xml文件的屬性
  /// </summary>

  public void readxmlattributes()
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);

   try
   {
    while(xmltxtrd.read())
    {
     if (xmltxtrd.nodetype == xmlnodetype.element)
     {
      if (xmltxtrd.hasattributes)
      {
       this._listbox.items.add("the element " + xmltxtrd.name + " has " + xmltxtrd.attributecount + " attributes");

       this._listbox.items.add("the attributes are:");

       while(xmltxtrd.movetonextattribute())
       {
        this._listbox.items.add(xmltxtrd.name + " = " + xmltxtrd.value);
       }
      }
      else
      {
       this._listbox.items.add("the element " + xmltxtrd.name + " has no attribute");
      }
      this._listbox.items.add("");
     }
    }
   }
   catch(xmlexception xmlexp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + xmlexp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 讀取xml文件的命名空間
  /// </summary>

  public void readxmlnamespace()
  {
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);
   try
   {
    while(xmltxtrd.read())
    {
     if (xmltxtrd.nodetype == xmlnodetype.element && xmltxtrd.prefix != "")
     {
      this._listbox.items.add("the prefix " + xmltxtrd.prefix + " is associated with namespace " + xmltxtrd.namespaceuri);

      this._listbox.items.add("the element with the local name " + xmltxtrd.localname + " is associated with" + " the namespace " + xmltxtrd.namespaceuri);
     }

     if (xmltxtrd.nodetype == xmlnodetype.element && xmltxtrd.hasattributes)
     {
      while(xmltxtrd.movetonextattribute())
      {
       if (xmltxtrd.prefix != "")
       {
        this._listbox.items.add("the prefix " + xmltxtrd.prefix + " is associated with namespace " + xmltxtrd.namespaceuri);

        this._listbox.items.add("the attribute with the local name " + xmltxtrd.localname + " is associated with the namespace " + xmltxtrd.namespaceuri);

       }
      }
     }
    }
   }
   catch(xmlexception xmlexp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + xmlexp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }

  /// <summary>
  /// 讀取整個xml文件
  /// </summary>

  public void readxml()
  {
   string attandele = string.empty;
   this._listbox.items.clear();
   this.xmltxtrd = new xmltextreader(this._xmlpath);

   try
   {
    while(xmltxtrd.read())
    {
     if (xmltxtrd.nodetype == xmlnodetype.xmldeclaration)
      this._listbox.items.add(string.format("<?{0} {1} ?>",xmltxtrd.name,xmltxtrd.value));
     else if (xmltxtrd.nodetype == xmlnodetype.element)
     {
      attandele = string.format("<{0} ",xmltxtrd.name);
      if (xmltxtrd.hasattributes)
      {
       while(xmltxtrd.movetonextattribute())
       {
        attandele = attandele + string.format("{0}='{1}' ",xmltxtrd.name,xmltxtrd.value);
       }
      }

      attandele = attandele.trim() + ">";
      this._listbox.items.add(attandele);
     }
     else if (xmltxtrd.nodetype == xmlnodetype.endelement)
      this._listbox.items.add(string.format("</{0}>",xmltxtrd.name));
     else if (xmltxtrd.nodetype == xmlnodetype.text)
      this._listbox.items.add(xmltxtrd.value);
    }
   }
   catch(xmlexception xmlexp)
   {
    throw new xmlexception(_errmsg + this._xmlpath + xmlexp.tostring());
   }
   finally
   {
    if (this.xmltxtrd != null)
     this.xmltxtrd.close();
   }
  }
 }
}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩欧美另类| 欧美成人午夜免费视在线看片| 日韩av电影中文字幕| 国产精品入口夜色视频大尺度| 国产精品久久久久久久一区探花| 一区二区三区视频在线| 国产精品99久久久久久久久| 97久久久免费福利网址| 国产精自产拍久久久久久| 黄网站色欧美视频| 亚洲福利视频久久| 欧美电影电视剧在线观看| 久久九九精品99国产精品| 欧美中文在线字幕| 岛国视频午夜一区免费在线观看| 亚洲级视频在线观看免费1级| 久久国产精品影片| 亚洲欧洲国产精品| 欧美福利在线观看| 欧美视频中文在线看| 色婷婷综合成人| 国产91精品高潮白浆喷水| 欧美性一区二区三区| 日韩大片在线观看视频| 欧美日本高清视频| 国模gogo一区二区大胆私拍| 欧美性xxxx在线播放| 国产成人av在线| 欧美亚洲一区在线| 亚洲精品福利在线观看| 国内精品久久久久久中文字幕| 欧美亚洲视频在线看网址| 成人午夜激情免费视频| 欧美三级欧美成人高清www| 欧美视频在线观看 亚洲欧| 亚洲字幕一区二区| 中文字幕日韩精品在线观看| 欧美日韩第一页| 正在播放亚洲1区| 亚洲第一黄色网| 欧美性开放视频| 欧美日韩成人精品| 性视频1819p久久| 97**国产露脸精品国产| 欧美性69xxxx肥| 97精品国产97久久久久久免费| 日本久久91av| 国产精品久久网| 国产精品亚洲综合天堂夜夜| 国产a∨精品一区二区三区不卡| 欧美性猛交xxxx免费看久久久| 国产精品亚洲一区二区三区| 色综合色综合久久综合频道88| 一本色道久久88精品综合| 国产精品99一区| 川上优av一区二区线观看| 国产欧美日韩丝袜精品一区| 欧美国产精品日韩| 97免费视频在线播放| 亚洲欧美色图片| 久久精品国产99国产精品澳门| 亚洲男人第一av网站| 成人免费观看a| 精品日韩中文字幕| 精品视频久久久久久久| 欧美在线激情网| 久久久精品电影| 亚洲欧洲黄色网| 欧美日韩视频免费播放| 亚洲精品永久免费| 中文字幕日韩精品有码视频| 亚洲精品成人网| 欧美极品少妇xxxxⅹ裸体艺术| 亚洲最大成人在线| 亚洲成年人在线| 国产精品久久激情| 久久久久久国产精品美女| 日韩欧美aⅴ综合网站发布| 日韩日本欧美亚洲| 中文字幕一精品亚洲无线一区| 久久久人成影片一区二区三区观看| 欧美日韩在线视频一区二区| 在线日韩日本国产亚洲| 伊人久久精品视频| 最近2019中文字幕一页二页| 国内精品伊人久久| 亚洲经典中文字幕| 久久亚洲影音av资源网| 成人啪啪免费看| 国产精品三级久久久久久电影| 日本午夜在线亚洲.国产| 亚洲天堂网站在线观看视频| 国产亚洲欧美日韩一区二区| 精品福利在线观看| 国产在线日韩在线| 国产99久久精品一区二区| 日韩免费电影在线观看| 精品国内产的精品视频在线观看| 成人有码在线视频| 91精品久久久久久| 亚洲天堂免费在线| 亚洲国产精品女人久久久| 亚洲精品电影在线观看| www.亚洲天堂| www.亚洲人.com| 欧美肥老太性生活视频| 国产日韩欧美自拍| 日韩一区二区在线视频| 欧美成人一二三| 欧美日韩一区二区免费在线观看| 亚洲成av人影院在线观看| 91系列在线观看| 国产精品99蜜臀久久不卡二区| 亚洲黄色片网站| www欧美xxxx| 亚洲美女免费精品视频在线观看| 中文国产成人精品久久一| 欧美最猛性xxxxx亚洲精品| 欧美激情精品久久久久久黑人| 亚洲男人av电影| 国产精品第一页在线| www.色综合| 亚洲欧美激情视频| 亚洲男人av电影| 国模精品一区二区三区色天香| 亚洲欧美在线x视频| 18久久久久久| 亚洲综合一区二区不卡| 欧美视频一二三| 亚洲一区美女视频在线观看免费| 日韩中文字幕网址| 亚洲www永久成人夜色| 亚洲第一网中文字幕| 成人免费在线视频网站| 国产亚洲精品久久| 国产成人一区二区三区电影| 91精品国产91久久久久久| 国产精品久久久久久久久影视| 国产va免费精品高清在线| 欧美另类精品xxxx孕妇| 亚洲精品久久久久国产| 在线成人中文字幕| 孩xxxx性bbbb欧美| 欧美精品日韩www.p站| 国产精品678| 国产午夜精品视频| 日韩在线视频中文字幕| 成人免费视频在线观看超级碰| 亚洲欧洲高清在线| 欧美一区二区影院| 国产欧美 在线欧美| 91视频九色网站| 久久69精品久久久久久久电影好| 超在线视频97| 久久精品视频中文字幕| 日本午夜精品理论片a级appf发布| 欧美主播福利视频| 国产主播精品在线| 国产日韩在线看| 成人午夜在线观看| 插插插亚洲综合网| 韩国v欧美v日本v亚洲| 国产日韩欧美中文在线播放| 国产精品久久77777|