Compartilhar via


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.Xmlda 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.

  1. Copie o arquivo Books.xml para a \Inetpub\Wwwroot pasta em seu computador.

  2. Abra o Visual Studio.

  3. 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.

  4. Especifique a using diretiva no System.Xml namespace para que você não precise qualificar as XmlTextReader declarações de classe posteriormente em seu código. Você deve usar a diretiva using antes de qualquer outra declaração.

    using System.Xml;
    
  5. 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 com XmlTextReader. Adicione o seguinte exemplo de código ao procedimento principal da classe padrão:

    String URLString = "http://localhost/books.xml";
    
  6. 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. A XmlTextReader classe tem construtores diferentes para especificar o local dos dados XML. O código a seguir cria uma instância de um XmlTextReader objeto e passa a URL para o construtor:

    XmlTextReader reader = new XmlTextReader (URLString);
    
  7. 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 o Read método para obter o próximo registro. O Read 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();
    
  8. 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. As Name propriedades and Value 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). A NodeType 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;
        }
    }
    
  9. 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 a HasAttributes propriedade para testar se o nó tem algum atributo. A AttributeCount 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;
        }
    }
    
  10. 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 .

Referências