Cómo encontrar y sustituir caracteres especiales en un archivo XML mediante Visual C# .NET

Seleccione idioma Seleccione idioma
Id. de artículo: 316063 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Resumen

En este artículo se describe cómo utilizar Visual C# .NET para sustituir caracteres especiales en un archivo de Lenguaje de marcado extensible (XML, Extensible Markup Language).

Descripción de la técnica

XML predefine las cinco referencias de entidades descritas a continuación para los caracteres especiales que de otra forma se interpretarían como parte del lenguaje de marcas:

Nombre del carácter Referencia de entidad Referencia de carácter Referencia numérica
Y comercial & & &
Abrir corchete angular &lt; < &#38;#60;
Cerrar corchete angular &gt; > &#62;
Comilla recta &quot; " &#39;
Apóstrofo &apos; ' &#34;


Es posible utilizar las referencias a entidades y caracteres para mostrar los corchetes angulares de apertura y cierre, la Y comercial y otros delimitadores. También puede utilizar referencias numéricas para los caracteres. Las referencias numéricas a los caracteres se convierten en cuanto son reconocidas. Además, se tratan como datos de caracteres, lo que permite utilizarlas.

Si declara cualquiera de las dos entidades indicadas a continuación:
  • <
  • &
tendrá que hacerlo como entidades internas cuyo texto de sustitución es una referencia de carácter al carácter correspondiente (la comilla angular de apertura o la Y comercial) que se desea mostrar. Para que las referencias a estas entidades produzcan un resultado bien formado es necesario duplicar la secuencia de escape utilizada.

Si declara cualquiera de las tres entidades indicadas a continuación:
  • >
  • '
  • "
deberá hacerlo como entidades internas cuyo texto de sustitución sea únicamente el carácter para el que hay que utilizar la secuencia de escape.

Determinar si es necesario sustituir un carácter especial

No es necesario: el archivo XML en el que los datos se obtienen de una base de datos

Si utiliza Microsoft .NET Framework, los datos se recuperan y almacenan en un objeto Conjunto de datos. Al escribir en un archivo XML los datos de un Conjunto de datos mediante el método WriteXml los caracteres especiales mencionados en la sección "Resumen" se sustituyen por las referencias de carácter correspondientes. por tanto, no es necesario realizar sustituciones especiales si se escriben archivos XML con información obtenida de un Conjunto de datos.

Necesario: el archivo XML que contiene datos XML de terceros con caracteres especiales

En ocasiones, el archivo o los datos XML provienen de un tercero que podría utilizar caracteres especiales. En este caso, los datos generarán errores al cargarse en un objeto XmlDocument o en un objeto XmlReader.

Cuando se encuentra el carácter de Y comercial aparece el siguiente error:
Error al analizar nombreDeEntidad, línea , posición .
donde línea y posición representan la posición exacta del carácter especial.

Cuando se encuentra un corchete angular de apertura aparece el siguiente error:
El carácter '<', valor hexadecimal 0x3C, no puede incluirse en un nombre. Línea , posición .
En este mensaje de error, la línea y la posición no indican la posición en la que el corchete izquierdo existe, sino en la que se encuentra el segundo corchete izquierdo.

Si el archivo XML contiene un corchete angular de cierre (>), un carácter de comillas rectas (") o un apóstrofe ('), los objetos XmlReader y XmlDocument los aceptarán, ya que para ellos únicamente es necesario realizar la sustitución de un carácter.

Reemplazar los caracteres especiales

Para remplazar los caracteres Y comercial y corchete angular de apertura:
  1. Cree el archivo XML.
  2. Cree la aplicación de Visual C# .NET e inserte el código.

Crear el archivo XML

Copie el siguiente código, péguelo en el Bloc de notas y, a continuación, guarde el archivo como clientes.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>
				

Crear un proyecto de Visual C# .NET

  1. Cree una nueva aplicación de Windows en .NET C#.
    1. Inicie Microsoft Visual Studio .NET.
    2. En el menú Archivo, seleccione Nuevo y haga clic en Proyecto.
    3. En el cuadro de diálogo Nuevo proyecto, haga clic en Visual C#en Tipo de proyectoy, después, haga clic en Aplicación Windows en Plantillas.
  2. Arrastre un control TextBox, dos controles Button y un control DataGrid al formulario predeterminado, Form1.cs.
  3. Configure la propiedad Multiline del control TextBox como True.
  4. Importe los siguientes espacios de nombres:
    using System.Xml;
    using System.IO;
    using System.Data.SqlClient;
    					
  5. Agregue el siguiente código después de la función 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. Agregue el código siguiente al evento Button1_Click:
    XmlDocument xmldoc = new XmlDocument();
            xmldoc = LoadXMLDoc();
            XmlNode nextnode; 
            nextnode = xmldoc.FirstChild.NextSibling;
            this.textBox1.Text = nextnode.OuterXml.ToString();
    					
  7. Agregue el código siguiente al evento 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. Modifique las propiedades de la cadena de conexión SqlConnection según sea necesario para su entorno.
  9. Genere y ejecute el proyecto.
  10. Haga clic en Button1.

    Los errores que recibe son los mismos que se explican en la sección Necesario: un archivo XML con caracteres especiales. A continuación, los datos XML se muestran en el control TextBox; el carácter Y comercial es sustituido por
  11. Haga clic en Button2.

    En el control DataGrid, companyname incluye un carácter Y comercial, y el control TextBox muestra los datos XML con

Referencias

Para obtener información adicional, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
251354 Cómo buscar y sustituir caracteres especiales en un documento XML con Visual Basic

Propiedades

Id. de artículo: 316063 - Última revisión: lunes, 23 de abril de 2007 - Versión: 4.3
La información de este artículo se refiere a:
  • Microsoft Visual C# .NET 2003 Standard Edition
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.0
  • Microsoft .NET Framework 1.1
Palabras clave: 
kbgrpdsmsxml kbhowtomaster kbmsxml KB316063

Enviar comentarios

 

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