Usar o Visual C# para ler dados XML de uma URL
Este artigo mostra como usar a XmlTextReader
classe para ler XML de uma URL. As informações transmitidas podem vir de todos os tipos de fontes, como um fluxo de bytes de um servidor, um arquivo ou uma TextReader
classe.
Versão original do produto: Visual Studio
Número original do KB: 307643
Requisitos
Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:
- Microsoft Visual Studio
- Terminologia XML
- Criando e lendo XML
- URLs e criação de um endpoint XML
Este artigo refere-se ao namespace System.Xml
da Biblioteca de Classes do .NET Framework.
Como ler dados XML de uma URL
Este exemplo usa um arquivo chamado Books.xml. Você pode criar seu próprio arquivo Books.xml ou usar o arquivo de exemplo incluído nos Inícios Rápidos do SDK (Software Development Kit) do .NET. Este arquivo também está disponível para download; consulte o primeiro item na seção Referências deste artigo para obter o local de download.
Copie o arquivo Books.xml para a
\Inetpub\Wwwroot
pasta em seu computador.Abra o Visual Studio.
Crie um novo aplicativo de console do Visual C#. Você pode continuar para a seção Listagem de código completa ou continuar com estas etapas para criar o aplicativo.
Especifique a using diretiva no
System.Xml
namespace para que você não precise qualificar asXmlTextReader
declarações de classe posteriormente em seu código. Você deve usar a diretiva using antes de qualquer outra declaração.using System.Xml;
Recupere o fluxo XML por meio de uma URL. Os fluxos são usados para fornecer independência do dispositivo; portanto, as alterações de programa não serão necessárias se a origem de um fluxo for alterada. Declare uma constante para a
http://localhost/books.xml
URL. Você usará a constante na próxima etapa comXmlTextReader
. Adicione o seguinte exemplo de código ao procedimento principal da classe padrão:String URLString = "http://localhost/books.xml";
Crie uma instância da
XmlTextReader
classe e especifique a URL. Normalmente,XmlTextReader
é usado se você precisar acessar o XML como dados brutos sem a sobrecarga de um DOM (Document Object Model); portanto,XmlTextReader
fornece um mecanismo mais rápido para ler o XML. AXmlTextReader
classe tem construtores diferentes para especificar o local dos dados XML. O código a seguir cria uma instância de umXmlTextReader
objeto e passa a URL para o construtor:XmlTextReader reader = new XmlTextReader (URLString);
Leia o XML.
Observação
Esta etapa mostra um loop externo
while
básico, e as próximas duas etapas descrevem como usar esse loop e ler XML.Depois de carregado,
XmlTextReader
executa leituras sequenciais para se mover pelos dados XML e usa oRead
método para obter o próximo registro. ORead
método retornará false se não houver mais registros.while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();
Inspecione os nós. Para processar os dados XML, cada registro tem um tipo de nó que pode ser determinado a
NodeType
partir da propriedade. AsName
propriedades andValue
retornam o nome do nó (os nomes de elemento e atributo) e o valor do nó (o texto do nó) do nó atual (ou registro). ANodeType
enumeração determina o tipo de nó. O código de exemplo a seguir exibe o nome dos elementos e o tipo de documento.Observação
Este exemplo ignora atributos de elemento.
while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // The node is an element. Console.Write("<" + reader.Name); Console.WriteLine(">"); break; case XmlNodeType.Text: //Display the text in each element. Console.WriteLine (reader.Value); break; case XmlNodeType.EndElement: //Display the end of the element. Console.Write("</" + reader.Name); Console.WriteLine(">"); break; } }
Inspecione os atributos. Os tipos de nó de elemento podem incluir uma lista de nós de atributo associados a eles. O
MovetoNextAttribute
método se move sequencialmente por cada atributo no elemento. Use aHasAttributes
propriedade para testar se o nó tem algum atributo. AAttributeCount
propriedade retorna o número de atributos para o nó atual.while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // The node is an element. Console.Write("<" + reader.Name); while (reader.MoveToNextAttribute()) // Read the attributes. Console.Write(" " + reader.Name + "='" + reader.Value + "'"); Console.Write(">"); Console.WriteLine(">"); break; case XmlNodeType.Text: //Display the text in each element. Console.WriteLine (reader.Value); break; case XmlNodeType. EndElement: //Display the end of the element. Console.Write("</" + reader.Name); Console.WriteLine(">"); break; } }
Compile e execute seu projeto.
Listagem de código completo
using System;
using System.Xml;
namespace ReadXMLfromURL
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
String URLString = "http://localhost/books.xml";
XmlTextReader reader = new XmlTextReader (URLString);
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Read the attributes.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.Write(">");
Console.WriteLine(">");
break;
case XmlNodeType.Text: //Display the text in each element.
Console.WriteLine (reader.Value);
break;
case XmlNodeType. EndElement: //Display the end of the element.
Console.Write("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
}
}
}
Saída de exemplo
<bookstore>
<book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">
<title>
The Autobiography of Benjamin Franklin
</title>
<author>
<first-name>
Benjamin
</first-name>
<last-name>
Franklin
</last-name>
</author>
<price>
8.99
</price>
</book>
<book genre="novel" publicationdate="1967" ISBN="0-201-63361-2">>
<title>
The Confidence Man
</title>
<author>
<first-name>
Herman
</first-name>
<last-name>
Melville
</last-name>
</author>
<price>
11.99
</price>
</book>
<book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
<title>
The Gorgias
</title>
<author>
<name>
Plato
</name>
</author>
<price>
9.99
</price>
</book>
</bookstore>
Solução de problemas
Ao testar o código, você pode receber a seguinte mensagem de erro de exceção:
Ocorreu uma exceção sem tratamento do tipo System.Xml.XmlException em system.xml.dll Informações adicionais: Declaração XML inesperada. A declaração XML deve ser o primeiro nó no documento e nenhum caractere de espaço em branco pode aparecer antes dele. Linha 1, posição 4.
O erro de exceção ocorre na linha de código a seguir.
while (reader.Read())
Para resolver o erro de exceção, remova o caractere de espaço em branco que precede o primeiro nó no documento Books.xml .