Usar o Visual C# para ler dados XML de uma URL

Este artigo mostra como usar a XmlTextReader classe para ler XML a partir de uma URL. As informações transmitidas podem vir de tipos de fontes, como um fluxo de bytes de um servidor, um arquivo ou uma TextReader classe.

Versão do produto original:   Visual Studio
Número do 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 da biblioteca de classes do .NET Framework System.Xml .

Como ler dados XML de uma URL

Este exemplo usa um arquivo chamado Books.xml. Você pode criar seu próprio arquivo de Books.xml ou usar o arquivo de exemplo incluído no .net Software Development Kit (SDK) QuickStartES. Este arquivo também está disponível para download; consulte o primeiro item da seção referências deste artigo para o local de download.

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

  2. Abra o Visual Studio.

  3. Criar um novo aplicativo de console do Visual C#. Você pode continuar com a seção de listagem de código completa ou continuar por estas etapas para criar o aplicativo.

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

    using System.Xml;
    
  5. Recuperar o fluxo XML por meio de uma URL. Os fluxos são usados para fornecer independência do dispositivo; Portanto, as alterações no programa não serão necessárias se a origem de um Stream for alterada. Declare uma constante para a http://localhost/books.xml URL. Você usará a constante na próxima etapa com XmlTextReader . Adicione o exemplo de código a seguir 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 modelo de objeto de documento (dom); 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, externo while e as próximas duas etapas descrevem como usar esse loop e ler XML.

    Depois de carregado, o XmlTextReader realiza 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 partir da NodeType propriedade. As Name Value Propriedades e retornam o nome do nó (os nomes do elemento e do 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 de forma seqüencial por cada atributo no elemento. Use a HasAttributes propriedade para testar se o nó tem qualquer 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. Criar e executar o projeto.

Listagem 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 manipulada do tipo System.Xml.Xmlexceção ocorreu em system.xml.dll informações adicionais: declaração XML inesperada. A declaração XML deve ser o primeiro nó do documento e nenhum espaço em branco pode aparecer antes dele. Linha 1, posição 4.

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

while (reader.Read())

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

Referências