Odczytywanie danych XML z adresu URL przy użyciu języka Visual C#
W tym artykule pokazano, jak używać XmlTextReader
klasy do odczytywania kodu XML z adresu URL. Przesyłane strumieniowo informacje mogą pochodzić ze wszystkich rodzajów źródeł, takich jak strumień bajtów z serwera, pliku lub TextReader
klasy.
Oryginalna wersja produktu: Visual Studio
Oryginalny numer KB: 307643
Wymagania
W tym artykule założono, że znasz następujące tematy:
- Microsoft Visual Studio
- Terminologia XML
- Tworzenie i odczytywanie kodu XML
- Adresy URL i tworzenie punktu końcowego XML
W tym artykule odwołuje się do przestrzeni nazw System.Xml
biblioteki klas programu .NET Framework .
Jak odczytywać dane XML z adresu URL
W tym przykładzie użyto pliku o nazwie Books.xml. Możesz utworzyć własny plik Books.xml lub użyć przykładowego pliku dołączonego do przewodnika Szybki start zestawu .NET Software Development Kit (SDK). Ten plik jest również dostępny do pobrania; Zapoznaj się z pierwszym elementem w sekcji Odwołania w tym artykule, aby zapoznać się z lokalizacją pobierania.
Skopiuj plik Books.xml do
\Inetpub\Wwwroot
folderu na komputerze.Otwórz program Visual Studio.
Utwórz nową aplikację konsolową Visual C#. Możesz przejść do sekcji Ukończ listę kodu lub przejść przez te kroki, aby skompilować aplikację.
Określ dyrektywę using w
System.Xml
przestrzeni nazw, aby nie trzeba było kwalifikowaćXmlTextReader
deklaracji klas w dalszej części kodu. Należy użyć dyrektywy using przed wszelkimi innymi deklaracjami.using System.Xml;
Pobierz strumień XML za pomocą adresu URL. Strumienie są używane do zapewnienia niezależności od urządzenia; w związku z tym zmiany programu nie są wymagane, jeśli źródło strumienia ulegnie zmianie. Zadeklaruj
http://localhost/books.xml
stałą dla adresu URL. Użyjesz stałej w następnym kroku za pomocą poleceniaXmlTextReader
. Dodaj następujący przykładowy kod do głównej procedury klasy domyślnej:String URLString = "http://localhost/books.xml";
Utwórz wystąpienie
XmlTextReader
klasy i określ adres URL. Zazwyczaj jest używany,XmlTextReader
jeśli konieczne jest uzyskanie dostępu do kodu XML jako danych pierwotnych bez narzutu modelu obiektów dokumentów (DOM), w związku z tymXmlTextReader
zapewnia szybszy mechanizm odczytywania kodu XML. KlasaXmlTextReader
ma różne konstruktory, aby określić lokalizację danych XML. Poniższy kod tworzy wystąpienieXmlTextReader
obiektu i przekazuje adres URL do konstruktora:XmlTextReader reader = new XmlTextReader (URLString);
Odczytywanie kodu XML.
Uwaga 16.
W tym kroku przedstawiono podstawową, zewnętrzną
while
pętlę i dwa następne kroki opisują sposób używania tej pętli i odczytywania kodu XML.Po załadowaniu wykonuje sekwencyjne operacje odczytu w
XmlTextReader
celu przejścia między danymi XML i używaRead
metody w celu uzyskania następnego rekordu. MetodaRead
zwraca wartość false, jeśli nie ma więcej rekordów.while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();
Sprawdź węzły. Aby przetworzyć dane XML, każdy rekord ma typ węzła, który można określić z
NodeType
właściwości . WłaściwościName
iValue
zwracają nazwę węzła (nazwy elementów i atrybutów) oraz wartość węzła (tekst węzła) bieżącego węzła (lub rekordu). WyliczenieNodeType
określa typ węzła. Poniższy przykładowy kod wyświetla nazwę elementów i typ dokumentu.Uwaga 16.
W tym przykładzie ignorowane są atrybuty elementu.
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; } }
Sprawdź atrybuty. Typy węzłów elementów mogą zawierać listę węzłów atrybutów, które są z nimi skojarzone. Metoda
MovetoNextAttribute
przenosi się sekwencyjnie przez każdy atrybut w elemecie .HasAttributes
Użyj właściwości , aby sprawdzić, czy węzeł ma jakiekolwiek atrybuty. WłaściwośćAttributeCount
zwraca liczbę atrybutów dla bieżącego węzła.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; } }
Skompiluj i uruchom projekt.
Kompletna lista kodu
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;
}
}
}
}
}
Przykładowe dane wyjściowe
<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>
Rozwiązywanie problemów
Podczas testowania kodu może zostać wyświetlony następujący komunikat o błędzie wyjątku:
Wystąpił nieobsługiwany wyjątek typu System.Xml.XmlException w system.xml.dll Dodatkowe informacje: nieoczekiwana deklaracja XML. Deklaracja XML musi być pierwszym węzłem w dokumencie i przed nim nie mogą być wyświetlane żadne znaki odstępu. Linia 1, pozycja 4.
Błąd wyjątku występuje w następującym wierszu kodu.
while (reader.Read())
Aby rozwiązać problem z błędem wyjątku, usuń znak odstępu, który poprzedza pierwszy węzeł w dokumencie Books.xml .