Uso de Visual C# para leer datos XML de una dirección URL
En este artículo se muestra cómo usar la XmlTextReader clase para leer XML desde una dirección URL. La información en secuencias puede proceder de tipos de orígenes, como una secuencia de bytes de un servidor, un archivo o una TextReader clase.
Versión del producto original: Visual Studio
Número de KB original: 307643
Requisitos
En este artículo se supone que está familiarizado con los temas siguientes:
- Microsoft Visual Studio
- Terminología XML
- Creación y lectura de XML
- Direcciones URL y creación de un punto de conexión XML
En este artículo se hace referencia al espacio de nombres System.Xml.NET Framework biblioteca de clases .
Cómo leer datos XML desde una dirección URL
En este ejemplo se usa un archivo denominado Books.xml. Puede crear su propio archivo deBooks.xml o usar el archivo de ejemplo que se incluye con las guías de inicio rápido del Kit de desarrollo de software (SDK) de .NET. Este archivo también está disponible para su descarga; Consulte el primer elemento de la sección Referencias de este artículo para ver la ubicación de descarga.
Copie el archivo Books.xml en la carpeta del
\Inetpub\Wwwrootequipo.Abra Visual Studio.
Cree una nueva aplicación de consola de Visual C#. Puede continuar con la sección Lista completa de código o continuar con estos pasos para compilar la aplicación.
Especifique la directiva using en el
System.Xmlespacio de nombres para que no sea necesario calificar las declaraciones de clase más adelante en elXmlTextReadercódigo. Debe usar la directiva using antes de cualquier otra declaración.using System.Xml;Recupere la secuencia XML mediante una dirección URL. Secuencias se usan para proporcionar independencia del dispositivo; por lo tanto, los cambios del programa no son necesarios si cambia el origen de una secuencia. Declare una constante para la
http://localhost/books.xmldirección URL. Usará la constante en el paso siguiente conXmlTextReader. Agregue el siguiente ejemplo de código al procedimiento principal de la clase predeterminada:String URLString = "http://localhost/books.xml";Cree una instancia de la
XmlTextReaderclase y especifique la dirección URL. Normalmente,XmlTextReaderse usa si necesita acceder al XML como datos sin procesar sin la sobrecarga de un modelo de objetos de documento (DOM); por lo tanto,XmlTextReaderproporciona un mecanismo más rápido para leer el XML. LaXmlTextReaderclase tiene constructores diferentes para especificar la ubicación de los datos XML. El código siguiente crea una instancia de unXmlTextReaderobjeto y pasa la dirección URL al constructor:XmlTextReader reader = new XmlTextReader (URLString);Lea el XML.
Nota
En este paso se muestra un bucle externo
whilebásico y los dos pasos siguientes describen cómo usar ese bucle y leer XML.Una vez cargado,
XmlTextReaderrealiza lecturas secuenciales para moverse por los datos XML y usa elReadmétodo para obtener el siguiente registro. ElReadmétodo devuelve false si no hay más registros.while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();Inspeccione los nodos. Para procesar los datos XML, cada registro tiene un tipo de nodo que se puede determinar a partir de la
NodeTypepropiedad . LasNamepropiedades yValuedevuelven el nombre del nodo (los nombres de elemento y atributo) y el valor del nodo (el texto del nodo) del nodo actual (o registro). LaNodeTypeenumeración determina el tipo de nodo. En el código de ejemplo siguiente se muestra el nombre de los elementos y el tipo de documento.Nota
En este ejemplo se omiten los 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; } }Inspeccione los atributos. Los tipos de nodo de elemento pueden incluir una lista de nodos de atributo asociados a ellos. El
MovetoNextAttributemétodo se mueve secuencialmente a través de cada atributo del elemento. Use laHasAttributespropiedad para probar si el nodo tiene atributos. LaAttributeCountpropiedad devuelve el número de atributos del nodo actual.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 y ejecute el proyecto.
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;
}
}
}
}
}
Salida de ejemplo
<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>
Solución de problemas
Al probar el código, puede recibir el siguiente mensaje de error de excepción:
Excepción no controlada del tipo System.Xml. XmlException se produjo en system.xml.dll Información adicional: Declaración XML inesperada. La declaración XML debe ser el primer nodo del documento y no se permite que aparezcan caracteres de espacio en blanco delante de él. Línea 1, posición 4.
El error de excepción se produce en la siguiente línea de código.
while (reader.Read())
Para resolver el error de excepción, quite el carácter de espacio en blanco que precede al primer nodo del documento deBooks.xml .