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 |
< |
< |
&#60; |
| Right angle bracket |
> |
> |
> |
| Straight quotation mark |
" |
" |
' |
| Apostrophe |
' |
' |
" |
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:
- Crie o ficheiro XML.
- 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
- Criar uma nova aplicação Visual C# .NET Windows da seguinte forma:
- Inicie o Microsoft Visual Studio NET..
- No menu ficheiro , aponte para Novo e, em seguida, clique em projecto .
- 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 .
- 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.
- Defina a propriedade várias linhas da caixa de texto como true .
- Importar os espaços de nomes seguintes:
using System.Xml;
using System.IO;
using System.Data.SqlClient;
- 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 = "&";
}
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);
}
- 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();
- 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);
}
- Altere as propriedades na cadeia de ligação SqlConnection conforme necessário para o seu ambiente.
- Crie e execute o projecto.
- 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 - Clique em Button2 .
Em DataGrid , repare que companyname tem um "e" comercial e que a caixa de texto apresenta os dados XML com
Para obter informações adicionais, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
251354
(http://support.microsoft.com/kb/251354/
)
Como localizar e substituir caracteres especiais num documento XML com o Visual Basic
Artigo: 316063 - Última revisão: quinta-feira, 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
| kbmt kbgrpdsmsxml kbhowtomaster kbmsxml KB316063 KbMtpt |
Tradução automáticaIMPORTANTE: 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
(http://support.microsoft.com/kb/316063/en-us/
)