Visual C# gebruiken om XML-gegevens uit een URL te lezen
In dit artikel leest u hoe u de XmlTextReader
klasse gebruikt om XML uit een URL te lezen. De gestreamde informatie kan afkomstig zijn van allerlei soorten bronnen, zoals een bytestroom van een server, een bestand of een TextReader
klasse.
Oorspronkelijke productversie: Visual Studio
Oorspronkelijk KB-nummer: 307643
Behoeften
In dit artikel wordt ervan uitgegaan dat u bekend bent met de volgende onderwerpen:
- Microsoft Visual Studio
- XML-terminologie
- XML maken en lezen
- URL's en het maken van een XML-eindpunt
Dit artikel verwijst naar de .NET Framework Class Library-naamruimte System.Xml
.
XML-gegevens lezen uit een URL
In dit voorbeeld wordt een bestand met de naam Books.xml gebruikt. U kunt uw eigen Books.xml-bestand maken of het voorbeeldbestand gebruiken dat is opgenomen in de QuickStarts van de .NET Software Development Kit (SDK). Dit bestand is ook beschikbaar om te downloaden; raadpleeg het eerste item in de sectie Verwijzingen van dit artikel voor de downloadlocatie.
Kopieer het Books.xml bestand naar de
\Inetpub\Wwwroot
map op uw computer.Open Visual Studio.
Maak een nieuwe Visual C#-consoletoepassing. U kunt doorgaan naar de sectie Volledige codevermelding of doorgaan met deze stappen om de toepassing te bouwen.
Geef de using-instructie op voor de
System.Xml
naamruimte, zodat u deXmlTextReader
klassedeclaraties later in uw code niet hoeft te kwalificeren. U moet de using-instructie gebruiken vóór andere declaraties.using System.Xml;
Haal de XML-stream op met behulp van een URL. Streams worden gebruikt om onafhankelijkheid van het apparaat te bieden; Programmawijzigingen zijn dus niet vereist als de bron van een stream verandert. Declareer een constante voor de
http://localhost/books.xml
URL. U gebruikt de constante in de volgende stap metXmlTextReader
. Voeg het volgende codevoorbeeld toe aan de hoofdprocedure van de standaardklasse:String URLString = "http://localhost/books.xml";
Maak een exemplaar van de
XmlTextReader
klasse en geef de URL op.XmlTextReader
Normaal gesproken wordt gebruikt als u toegang nodig hebt tot de XML als onbewerkte gegevens zonder de overhead van een Document Object Model (DOM).XmlTextReader
Dit biedt dus een sneller mechanisme voor het lezen van de XML. DeXmlTextReader
klasse heeft verschillende constructors om de locatie van de XML-gegevens op te geven. Met de volgende code wordt een exemplaar van eenXmlTextReader
object gemaakt en wordt de URL doorgegeven aan de constructor:XmlTextReader reader = new XmlTextReader (URLString);
Lees de XML.
Notitie
Deze stap toont een eenvoudige, buitenste
while
lus en de volgende twee stappen beschrijven hoe u die lus gebruikt en XML leest.Nadat deze is geladen,
XmlTextReader
voert u sequentiële leesbewerkingen uit om door de XML-gegevens te lopen en gebruikt u deRead
methode om de volgende record te verkrijgen. DeRead
methode retourneert onwaar als er geen records meer zijn.while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();
Inspecteer de knooppunten. Voor het verwerken van de XML-gegevens heeft elke record een knooppunttype dat kan worden bepaald op basis van de
NodeType
eigenschap. DeName
enValue
eigenschappen retourneren de naam van het knooppunt (het element en de kenmerknamen) en de knooppuntwaarde (de knooppunttekst) van het huidige knooppunt (of record). DeNodeType
opsomming bepaalt het knooppunttype. In de volgende voorbeeldcode wordt de naam van de elementen en het documenttype weergegeven.Notitie
In dit voorbeeld worden elementkenmerken genegeerd.
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; } }
Inspecteer de kenmerken. Elementknooppunttypen kunnen een lijst met kenmerkknooppunten bevatten die eraan zijn gekoppeld. De
MovetoNextAttribute
methode wordt opeenvolgend door elk kenmerk in het element verplaatst. Gebruik deHasAttributes
eigenschap om te testen of het knooppunt kenmerken heeft. DeAttributeCount
eigenschap retourneert het aantal kenmerken voor het huidige knooppunt.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; } }
Bouw uw project en voer het uit.
Volledige codevermelding
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;
}
}
}
}
}
Voorbeelduitvoer
<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>
Probleemoplossing
Wanneer u de code test, wordt mogelijk het volgende uitzonderingsfoutbericht weergegeven:
Er is een niet-verwerkte uitzondering van het type System.Xml.XmlException opgetreden in system.xml.dll Aanvullende informatie: Onverwachte XML-declaratie. De XML-declaratie moet het eerste knooppunt in het document zijn en er mogen geen spatietekens worden weergegeven voordat het wordt weergegeven. Lijn 1, positie 4.
De uitzonderingsfout treedt op op de volgende coderegel.
while (reader.Read())
Als u de uitzonderingsfout wilt oplossen, verwijdert u het spatieteken dat voorafgaat aan het eerste knooppunt in het Books.xml document.