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

Resumen

Este artículo describe cómo sustituir caracteres especiales en un archivo de lenguaje de marcado Extensible (XML) mediante Visual C#.

Volver al principio

Descripción de la técnica

XML predefine las siguientes cinco referencias de entidad para caracteres especiales que de lo contrario se interpretaría como parte del lenguaje de marcado:



Puede utilizar las referencias de entidades y caracteres para escapar el corchete angular izquierdo, la y comercial y otros delimitadores. También puede utilizar referencias de caracteres numéricos. Referencias de caracteres numéricos se expanden inmediatamente cuando se reconocen. Además, como referencias de caracteres numéricos se tratan como datos de caracteres, puede utilizar las referencias de carácter numérico

Si declara cualquiera de las siguientes dos entidades:
  • <
  • & amp;
se debe declarar como entidades internas cuyo texto de sustitución es una referencia de carácter al carácter correspondiente (la comilla angular o la y comercial) que se desea mostrar. Este escape duplicado se requiere para estas entidades para que las referencias a ellos produzcan un resultado bien formado.

Si declara cualquiera de las tres entidades siguientes:
  • >
  • & apos;
  • & quot;
se debe declarar como entidades internas cuyo texto de sustitución sea únicamente el carácter que se desea mostrar.

Volver al principio

Determinar si es necesario sustituir un carácter especial

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

Cuando se utiliza la Microsoft.NET Framework, los datos se recuperan y se almacenan en un objeto DataSet . Al escribir datos desde un conjunto de datos a un archivo XML mediante el método WriteXml , los caracteres especiales mencionados en la sección "Resumen" se sustituyen por las referencias de carácter correspondientes. Por lo tanto, cuando se escriben archivos XML, y utilizar un conjunto de datos, no hay especiales es necesario realizar sustituciones.

Volver al principio

Requerido: Archivo que contiene datos XML de terceros con caracteres especiales

En ocasiones, el archivo XML o los datos XML que proceden de un tercero pueden utilizar estos caracteres especiales. En este escenario, los datos generarán errores al cargarse en un objeto XmlDocument o un objeto XmlReader .

Recibirá el siguiente mensaje de error cuando se encuentra el carácter de y comercial:
Se produjo un Error al analizar Nombre_entidad, línea # #de posición.
donde línea # y # de posición representan la posición exacta del carácter especial.

Recibirá el siguiente mensaje de error cuando se encuentra un corchete angular:
El ' <' carácter, con valor hexadecimal 0x3C, no puede incluirse en un nombre. Línea #, posición #.
En este mensaje de error, la línea # y # de posición no indican la posición donde se encuentra el corchete angular, pero donde se encuentra el segundo corchete izquierdo.

Si el archivo XML contiene un corchete angular derecho (>), comillas rectas (") o un apóstrofe ('), objetos XmlDocument el XmlReader y controlar estos objetos porque estos caracteres requieren sólo sustitución de un carácter.

Volver al principio

Reemplazar los caracteres especiales

Para reemplazar el símbolo de y comercial y los caracteres de corchete angular de apertura:

  1. Crear el archivo XML.
  2. Crear la aplicación .NET de Visual C# y, a continuación, inserte el código.
Volver al principio

Crear el archivo XML

Copie y pegue el código siguiente en 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>

Volver al principio

Crear el proyecto de Visual C#.

  1. Cree una nueva aplicación de Windows en .NET C# como sigue:
    1. Inicie Microsoft Visual Studio. NET.
    2. En el menú archivo, elija nuevo y, a continuación, haga clic en proyecto.
    3. En el cuadro de diálogo Nuevo proyecto , haga clic en Proyectos de Visual C# en Tipos de proyectoy, a continuación, haga clic en Aplicación para Windows en plantillas.
  2. Arrastre un control TextBox , dos controles Button y un control DataGrid desde el cuadro de herramientas al formulario predeterminado, Form1.cs.
  3. Establezca la propiedad Multiline del TextBox a True.
  4. Importar los espacios de nombres siguientes:
    using System.Xml;using System.IO;
    using System.Data.SqlClient;

  5. Agregue el código siguiente 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. Cambiar las propiedades en 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 coherentes con la descripción de los errores que se explican en el requerido: archivo XML con caracteres especiales sección. Los datos XML aparecen en el cuadro de texto; el carácter se reemplaza por
  11. Haga clic en Button2.

    En el DataGrid, observe que companyname incluye un signo de y comercial y que el control TextBox muestra los datos XML con
Volver al principio

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 encontrar y sustituir caracteres especiales en un documento XML con Visual Basic

Volver al principio
Propiedades

Id. de artículo: 316063 - Última revisión: 17 ene. 2017 - Revisión: 2

Comentarios