Uso de Visual C# para leer datos XML desde 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 transmitida puede provenir de todo tipo de orígenes, como una secuencia de bytes de un servidor, un archivo o una TextReader
clase.
Versión original del producto: Visual Studio
Número de KB original: 307643
Requisitos
En este artículo se da por supuesto 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
de la biblioteca de clases de .NET Framework .
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 de Books.xml o usar el archivo de ejemplo que se incluye con los inicios rápidos 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 la ubicación de descarga.
Copie el archivo Books.xml en la
\Inetpub\Wwwroot
carpeta del equipo.Abre Visual Studio.
Cree una nueva aplicación de consola de Visual C#. Puede continuar con la sección Lista de código completa o continuar con estos pasos para compilar la aplicación.
Especifique la directiva using en el
System.Xml
espacio de nombres para que no sea necesario calificar las declaraciones de clase más adelante en elXmlTextReader
código. Debe usar la directiva using antes de cualquier otra declaración.using System.Xml;
Recupere la secuencia XML mediante una dirección URL. Las secuencias se usan para proporcionar independencia del dispositivo; por lo tanto, los cambios de programa no son necesarios si cambia el origen de una secuencia. Declare una constante para la
http://localhost/books.xml
dirección URL. Usará la constante en el paso siguiente conXmlTextReader
. Agregue el ejemplo de código siguiente al procedimiento principal de la clase predeterminada:String URLString = "http://localhost/books.xml";
Cree una instancia de la
XmlTextReader
clase y especifique la dirección URL. Normalmente,XmlTextReader
se usa si necesita tener acceso al XML como datos sin procesar sin la sobrecarga de un modelo de objetos de documento (DOM); por lo tanto,XmlTextReader
proporciona un mecanismo más rápido para leer el XML. LaXmlTextReader
clase tiene constructores diferentes para especificar la ubicación de los datos XML. El código siguiente crea una instancia de unXmlTextReader
objeto y pasa la dirección URL al constructor:XmlTextReader reader = new XmlTextReader (URLString);
Lea el CÓDIGO XML.
Nota:
En este paso se muestra un bucle básico, externo
while
y los dos pasos siguientes se describe cómo usar ese bucle y leer XML.Una vez cargado,
XmlTextReader
realiza lecturas secuenciales para desplazarse por los datos XML y usa el método para obtener elRead
registro siguiente. ElRead
mé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 desde la
NodeType
propiedad . LasName
propiedades yValue
devuelven el nombre del nodo (los nombres de elemento y atributo) y el valor del nodo (el texto del nodo) del nodo actual (o registro). LaNodeType
enumeración determina el tipo de nodo. El código de ejemplo siguiente 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
MovetoNextAttribute
método se mueve secuencialmente a través de cada atributo del elemento . Use laHasAttributes
propiedad para probar si el nodo tiene atributos. LaAttributeCount
propiedad 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:
Se produjo una excepción no controlada del tipo System.Xml.XmlException 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 antes 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 Books.xml .