如何尋找及取代 Visual C#.NET 中的 XML 檔案中的特殊字元

重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。

按一下這裡查看此文章的英文版本:316063
本文已封存。本文係以「現狀」提供且不會再更新。
結論
本文將告訴您,如何使用 Visual C#.NET 取代可延伸標記語言 (XML) 檔案中的特殊字元。

該技巧的描述

XML predefines 特殊字元,否則會被解譯為標記語言的一部分,下列五個實體參考:

Character NameEntity ReferenceCharacter ReferenceNumeric Reference
Ampersand&&&
Left angle bracket&lt;<&#38;#60;
Right angle bracket&gt;>&#62;
Straight quotation mark&quot;"&#39;
Apostrophe&apos;'&#34;


您可以使用的實體與字元參考來逸出左的角括弧、 將連字號及其他分隔符號。您也可以使用數字字元參照。數字字元參照會展開立即時就會立即被辨認出來。在另外由於數字字元參照會被視為字元資料,您可以使用數字字元參照

如果您宣告下列兩個實體之一:
  • <
  • (& I)
您必須將它們宣告為內部的取代文字位於的個別字元 (向左的角括弧或連字號 (&amp;)) 被逸出字元參考的實體。這個雙引號的逸出是需要為這些實體,如此一來它們的參考會產生語式正確的結果。

如果您宣告任何下列三個實體:
  • >
  • '
  • "
您必須將它們宣告為內部實體的取代文字位於單一被逸出的字元。

判斷是否必須取代特殊字元

非必要: 從一個資料庫會擷取該資料的 XML 檔案

當您使用 Microsoft.NET Framework 時,資料會擷取並存放在 DataSet 物件中。當您將寫入資料從 資料集 的 XML 檔案使用 WriteXml 方法時,摘要 > 一節中所參考的特殊字元會以個別字元參考所取代。因此,當您撰寫 XML 檔案,而且您使用 資料集 沒有任何特殊取代處理程序是必要的。

您需要: XML 檔案,其中包含以特殊字元的第三方廠商 XML 資料

有時候 XML 檔案或來自協力廠商的 XML 資料可能會使用這些特殊字元。在這種情況下資料載入到 XmlDocument 物件或 XmlReader 物件時產生錯誤。

遇到連字號字元時,您會收到下列的錯誤訊息:
剖析 entity_name,時發生一個錯誤行數 #、 定位 #
其中行數 #,並將 # 代表特殊字元的確切位置。

左的角括弧發生時,您會收到下列的錯誤訊息:
在 '<' 字元十六進位值 0x3C,不能包含在一個名稱。線條#, position #.
此錯誤訊息,線條中 ## 未指出位置,左的角括弧存在的位置,但遇到第二個左的角括弧的位置。

如果 XML 檔包含右角括弧 (>)、 直線引號 (' ') 或加上一個省略符號 ('),XmlReaderXmlDocument 物件處理這些物件,因為這些字元需要只是單一字元取代。

取代特殊字元

若要取代連字號 (&amp;) 和左的角括弧字元:
  1. 建立 XML 檔案。
  2. 建立 Visual C#.NET] 應用程式,然後再插入程式碼。

建立 XML 檔案

複製並貼入 [記事本],貼上下列程式碼,然後將檔案儲存成 Customers.xml:
<?xml version="1.0" standalone="yes"?><Customers><Customer><CustomerID>BLAUS</CustomerID><CompanyName>Blauer See Delikatessen</CompanyName><ContactName>Hanna Moos</ContactName><Region>test<ing</Region></Customer><Customer><CustomerID>SPLIR</CustomerID><CompanyName>Split Rail Beer & Ale</CompanyName><ContactName>Art raunschweiger</ContactName><Region>WY</Region></Customer></Customers>				

建立 Visual C#.NET 專案

  1. 建立新的 Visual C#.NET Windows 應用程式如下所示:
    1. 啟動 Microsoft Visual Studio.NET。
    2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
    3. 在 [新增專案] 對話方塊按一下 [專案類型,] 下的 [Visual C# 專案,然後再按一下 [範本] 下方的 [Windows 應用程式
  2. 文字方塊 控制項、 兩個的 按鈕 控制項和 DataGrid 控制項從工具箱拖曳到您的預設表單,Form1.cs。
  3. 文字方塊Multiline 屬性設定為 True
  4. 匯入下列命名空間:
    using System.Xml;using System.IO;using System.Data.SqlClient;					
  5. Main 函式之後加入下列程式碼:
    string filepath = "C:\\Customers.xml";private void ReplaceSpecialChars(long linenumber)        {            System.IO.StreamReader strm;            string strline;            string strreplace = " ";            string tempfile = "C:\\Temp.xml";            try            {                System.IO.File.Copy(filepath,tempfile,true);            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }            StreamWriter strmwriter = new StreamWriter(filepath);            strmwriter.AutoFlush = true;            strm = new StreamReader(tempfile);            long i  = 0;            while (i < linenumber - 1)            {                strline = strm.ReadLine();                strmwriter.WriteLine(strline);                i = i + 1;            }            strline = strm.ReadLine();            Int32 lineposition;		            lineposition = strline.IndexOf("&");            if (lineposition > 0)             {                strreplace = "&amp;";            }            else            {                lineposition = strline.IndexOf("<",1);                if (lineposition > 0 )                {                    strreplace = "<";                }            }            strline = strline.Substring(0, lineposition - 1) + strreplace + strline.Substring(lineposition + 1);            strmwriter.WriteLine(strline);            strline = strm.ReadToEnd();            strmwriter.WriteLine(strline);            strm.Close();            strm = null;            strmwriter.Flush();            strmwriter.Close();            strmwriter = null;        }		        public XmlDocument LoadXMLDoc()         {        XmlDocument xdoc;        long lnum;		        try        {            xdoc = new XmlDocument();            xdoc.Load(filepath);        }        catch (XmlException ex)        {            MessageBox.Show(ex.Message);            lnum = ex.LineNumber;            ReplaceSpecialChars(lnum);            xdoc = LoadXMLDoc();        }    return (xdoc);    }					
  6. 將下列程式碼加入至 Button1_Click 事件:
    XmlDocument xmldoc = new XmlDocument();        xmldoc = LoadXMLDoc();        XmlNode nextnode;         nextnode = xmldoc.FirstChild.NextSibling;        this.textBox1.Text = nextnode.OuterXml.ToString();					
  7. 將下列程式碼加入至 Button2_Click 事件:
    DataSet ds = new DataSet();            XmlDocument xdoc = new XmlDocument();            SqlConnection cnNwind = new SqlConnection("Data source=myServerName;user id=myUser;Password=myPassword;Initial catalog=Northwind;");            SqlDataAdapter daCustomers = new SqlDataAdapter("Select customerid,companyname,contactname, region from customers where region='WY'", cnNwind);            string filepath = "C:\\Customers.xml";            try            {                daCustomers.Fill(ds, "Customers");                this.dataGrid1.DataSource = ds.Tables["Customers"];                ds.WriteXml(filepath);                xdoc.Load(filepath);                XmlNode nextnode;                 nextnode = xdoc.FirstChild.NextSibling;                textBox1.Text = nextnode.OuterXml.ToString();            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }					
  8. 變更在 SqlConnection 連接字串,視您的環境屬性。
  9. 建置並執行專案。
  10. 按一下 [Button1]。

    您收到的錯誤是與所述的錯誤描述一致 Required: An XML file with special characters 區段。XML 資料會出現在 文字方塊 中 ; 以取代連字號 (&amp;)
  11. 按一下 Button2

    DataGrid 中請注意該 companyname 有連字號,而且 文字方塊 會顯示與 XML 資料
参考
如需詳細資訊按一下 [下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項]:
251354如何尋找及取代 Visual Basic 的 XML 文件中的特殊字元

警告:本文為自動翻譯

內容

文章識別碼:316063 - 最後檢閱時間:12/07/2015 08:39:15 - 修訂: 4.4

Microsoft Visual C# .NET 2003 標準版, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft .NET Framework 1.0, Microsoft .NET Framework 1.1

  • kbnosurvey kbarchive kbmt kbgrpdsmsxml kbhowtomaster kbmsxml KB316063 KbMtzh
意見反應