Como localizar e substituir caracteres especiais num ficheiro XML com o Visual C# .NET

Traduções de Artigos Traduções de Artigos
Artigo: 316063 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sumário

Este artigo descreve como substituir caracteres especiais num ficheiro XML (Extensible Markup Language) utilizando o Visual C#. NET.

Descrição da técnica

XML predefine as seguintes cinco referências de entidade para caracteres especiais que caso contrário, seria interpretados como parte da linguagem de marcação:

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;


Pode utilizar referências de entidade e de caracteres para sair do Parêntese em ângulo esquerdo, o e comercial e outros delimitadores. Também pode utilizar referências de carácter numérico. Referências de carácter numérico são expandidas imediatamente quando forem reconhecidos. Além disso, uma vez que as referências de carácter numérico são tratadas como dados de caracteres, pode utilizar as referências de carácter numérico

Se declarar qualquer uma das seguintes duas entidades:
  • <
  • &
é necessário declará-los como entidades internas cujo texto de substituição é uma referência de carácter para o respectivo carácter (o parêntese em ângulo esquerdo ou o e comercial) que está a ser encerrada. Este sair dupla é necessário para estas entidades para que as referências aos mesmos produzem um resultado correcto.

Se declarar qualquer uma das seguintes três entidades:
  • >
  • '
  • "
é necessário declará-los como entidades internas cujo texto de substituição é o carácter que está a ser encerrado.

Determinar se tem de substituir um carácter especial

Não é necessário: ficheiro XML no qual os dados são obtidos a partir de uma base de dados

Quando estiver a utilizar o Microsoft .NET Framework, dados são obtidos e são armazenados num objecto DataSet . Quando escreve dados a partir de um DataSet para um ficheiro XML utilizando o método WriteXml , os caracteres especiais que são referidos na secção "Sumário" são substituídos por referências respectivo carácter. Por conseguinte, quando escreve ficheiros XML e se utiliza um DataSet , nenhum processo de substituição especial é necessário.

Necessários: Ficheiro XML, que contém dados XML de outros fabricantes com caracteres especiais

Por vezes, o ficheiro XML ou os dados XML provenientes de outras empresas podem utilizar estes caracteres especiais. Neste cenário, os dados gera erros quando carregá-lo para um objecto XmlDocument ou um objecto XmlReader .

Recebe a seguinte mensagem de erro quando é encontrado o carácter "e" comercial:
Ocorreu um erro ao análise entity_name, linha #, posicione #.
em que a linha # e coloque # representam a posição exacta do carácter especial.

Recebe a seguinte mensagem de erro quando é encontrado um parêntese em ângulo esquerdo:
O ' < ' carácter, valor hexadecimal 0x3C, não pode ser incluído num nome. Linha#, position #.
Nesta mensagem de erro, a linha # e # não indicam a posição onde o parêntese em ângulo esquerdo existe, mas onde é encontrado ao segundo Parêntese em ângulo esquerdo de posição.

Se o ficheiro XML contiver um parênteses de ângulo recto (>), uma aspa rectangular ('') ou um apóstrofo ('), o XmlReader e os objectos XmlDocument tratam estes objectos uma vez que estes caracteres necessitam apenas de carácter substituição.

Substituir os caracteres especiais

Para substituir o e comercial e os caracteres Parêntese em ângulo esquerdo:
  1. Crie o ficheiro XML.
  2. Crie a aplicação do Visual C# .NET e, em seguida, insira o código.

Criar o ficheiro XML

Copie e cole o seguinte código no bloco de notas e, em seguida, guarde o ficheiro como 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>
				

Criar projecto de Visual C# .NET

  1. Criar uma nova aplicação Visual C# .NET Windows da seguinte forma:
    1. Inicie o Microsoft Visual Studio NET..
    2. No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
    3. Na caixa de diálogo Novo projecto , clique em Visual C# Projects em Project Types e, em seguida, clique em Aplicação do Windows em modelos .
  2. Arraste um controlo de caixa de texto , dois controlos do botão e o controlo DataGrid da caixa de ferramentas para o formulário predefinido, Form1.cs.
  3. Defina a propriedade várias linhas da caixa de texto como true .
  4. Importar os espaços de nomes seguintes:
    using System.Xml;
    using System.IO;
    using System.Data.SqlClient;
    					
  5. Adicione o seguinte código depois da função principal :
    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. Adicione o seguinte código ao evento Button1_Click :
    XmlDocument xmldoc = new XmlDocument();
            xmldoc = LoadXMLDoc();
            XmlNode nextnode; 
            nextnode = xmldoc.FirstChild.NextSibling;
            this.textBox1.Text = nextnode.OuterXml.ToString();
    					
  7. Adicione o seguinte código ao 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. Altere as propriedades na cadeia de ligação SqlConnection conforme necessário para o seu ambiente.
  9. Crie e execute o projecto.
  10. Clique em Button1 .

    Os erros que recebe são consistentes com a descrição de erros que são explicados a Required: An XML file with special characters secção. Os dados XML aparecem na caixa de texto ; o e comercial é substituído pelo
  11. Clique em Button2 .

    Em DataGrid , repare que companyname tem um "e" comercial e que a caixa de texto apresenta os dados XML com

Referências

Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
251354Como localizar e substituir caracteres especiais num documento XML com o Visual Basic

Propriedades

Artigo: 316063 - Última revisão: 29 de março de 2007 - Revisão: 4.4
A informação contida neste artigo aplica-se 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
Palavras-chave: 
kbmt kbgrpdsmsxml kbhowtomaster kbmsxml KB316063 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 316063

Submeter comentários

 

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