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 de KB original: 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 ponto de extremidade XML

Este artigo refere-se ao namespace System.Xmlda Biblioteca de Classes .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 que está incluído com o SDK (Kit de Desenvolvimento de Software do .NET) Guias de Início Rápido. Esse arquivo também está disponível para download; Consulte o primeiro item na seção Referências deste artigo para o local de download.

  1. Copie o arquivoBooks.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 na seção Concluir listagem de código ou continuar por estas etapas para criar o aplicativo.

  4. Especifique a diretiva de uso no System.Xml namespace para que você não seja obrigado a qualificar as declarações de XmlTextReader classe posteriormente em seu código. Você deve usar a diretiva de uso 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 main 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 (Modelo de Objeto de Documento); 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 básico e externo while e as duas próximas etapas descrevem como usar esse loop e ler XML.

    Depois de carregado, XmlTextReader executa leituras sequenciais para mover os 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 na NodeType propriedade. As Name propriedades e 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 meio de cada atributo no elemento. Use a HasAttributes propriedade para testar se o nó tem atributos. 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. Crie e execute seu projeto.

Lista de código completa

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:

Uma exceção não tratada do tipo System.Xml. XmlException ocorreu 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 ser exibido antes dele. Linha 1, posição 4.

O erro de exceção ocorre na linha de código a seguir.

while (reader.Read())

Para resolve o erro de exceção, remova o caractere de espaço em branco que precede o primeiro nó no documento Books.xml.

Referências