如何查找和替换 Visual C#.net 为 XML 文件中的特殊字符

文章翻译 文章翻译
文章编号: 316063 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文介绍如何使用 Visual C#.net 替换在可扩展标记语言 (XML) 文件中的特殊字符。

该技术的说明

XML 预定义了以下五个的实体引用,否则会被解释为标记语言的一部分的特殊字符:

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


可以使用实体和字符引用进行转义左的尖括号、 &amp; 符和其他分隔符。您还可以使用数字字符引用。识别它们时立即扩展数字字符引用。此外,因为数字字符引用被视为字符数据,您可以使用数字字符引用

如果您声明下面两个实体的任意一个:
  • <
您必须将它们声明为内部的替换文字不到各自字符 (左的尖括号或 &amp; 符) 被转义的字符引用的实体。此双引号转义是需要为这些实体,以便对它们的引用生成一个格式正确的结果。

如果您声明的任一以下三种实体:
  • >
  • &apos;
  • "
您必须将它们声明为内部实体的替换文字不被转义的单个字符。

确定是否必须替换特殊字符

不是必需的: 从数据库检索数据的 XML 文件

时使用的 Microsoft.net 框架数据检索和存储在 数据集 对象中。当您写入数据从 数据集 的 XML 文件使用 WriteXml 方法时,"摘要"部分中所引用的特殊字符都将替换为相应字符引用。因此,在编写 XML 文件时,并使用 数据集 没有特殊替换所需的过程。

必需: XML 文件,其中包含特殊字符的第三方 XML 数据

在某些情况下该 XML 文件或来自第三方的 XML 数据可能会使用这些特殊字符。在这种情况下数据生成错误时将其加载到 如下 的对象或 XmlReader 对象。

当遇到与符号字符时,您会收到以下错误消息:
分析 entity_name,时发生一个错误行 #,定位 #
在行 # 并定位 # 表示特殊字符的确切位置。

当遇到一个左的角括号时,您会收到以下错误消息:
在 < 字符,十六进制值 0x3C,不能包含在 $ 名称中。行#, position #.
在此的错误消息在行 ## 并不表示左的尖括号的存在的但第二个左的尖括号遇到时的所在位置的位置。

如果 XML 文件包含右尖括号 (&gt;)、 直引号 (") 或撇号 (') 将XmlReader 和 $ 如下 对象处理这些对象,因为这些字符需要的只是单个字符替换。

替换特殊字符

若要替换 &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. TextBox 控件、 两个的 按钮 控件和一个 DataGrid 控件从工具箱拖到您的默认表单 Form1.cs。
  3. 文本框多行 属性设置为 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 数据将显示在 文本框 中,连字符替换为
  11. 单击 Button2

    DataGrid 中,请注意该 companyname 都有一个 & 符和 文本框 显示 XML 数据

参考

有关更多的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
251354如何查找和替换的 Visual Basic 的 XML 文档中的特殊字符

属性

文章编号: 316063 - 最后修改: 2007年3月29日 - 修订: 4.4
这篇文章中的信息适用于:
  • Microsoft Visual C# .NET 2003 标准版
  • Microsoft Visual C# .NET 2002 标准版
  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.1
关键字:?
kbmt kbgrpdsmsxml kbhowtomaster kbmsxml KB316063 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 316063
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com