Freigeben über


Lesen von XML-Fragmenten mit "XmlValidatingReader"

Die XmlValidatingReader-Klasse kann XML-Fragmente lesen, indem sie eine Zeichenfolge als ein Fragment eines XML-Codes analysiert.

HinweisHinweis

Die XmlValidatingReader-Klasse ist in .NET Framework, Version 2.0 veraltet.Mit der XmlReaderSettings-Klasse und der Create-Methode können Sie eine XmlReader-Instanz zur Validierung erstellen.Weitere Informationen finden Sie unter Validieren von XML-Daten mit "XmlReader".

XmlParserContext-Klasse

Die XmlParserContext-Klasse wird verwendet, um ein XmlValidatingReader-Objekt mit den für das Analysieren eines XML-Fragments oder -Dokuments erforderlichen Kontextinformationen zu erstellen. Die XmlParserContext-Klasse kann verschiedene Informationen bereitstellen, z. B., die zu verwendende XmlNameTable, den Namespace-Gültigkeitsbereich, die Document Type Definition (DTD – Dokumenttypdefinition), die Codierung und den aktuellen xml:lang-Gültigkeitsbereich und den aktuellen xml:space-Gültigkeitsbereich.

Geben Sie beim Erstellen des XmlValidatingReader-Objekts auch den XML-Knotentyp an. Der XML-Knotentyp bestimmt, ob die Daten als Fragment oder als wohlgeformtes XML-Dokument analysiert werden. In der folgende Tabelle wird der Knotentyp veranschaulicht sowie der Datentyp, den der Parser jeweils erwartet. Das Übergeben eines beliebigen anderen XmlNodeType-Werts hat das Auslösen einer ArgumentException zur Folge.

Typ

Fragmentinhalt

Element

Alle gültigen Elementinhalte, z. B. Kombinationen aus Elementen, Kommentaren, Verarbeitungsanweisungen, CDATA und Text.

XML-Deklarationen können auch als erster Knoten auftreten. Dadurch können Sie die Codierung für ein XML-Fragment angeben.

Attribut

Der Wert eines Attributs.

Dokument

Der Inhalt eines vollständigen XML-Dokuments. Mit diesem Typ werden die Regeln für wohlgeformte XML-Dokumente erzwungen.

Entitätsverweise im Inhalt von Elementen oder Attributen werden entsprechend dem EntityHandling-Flag verarbeitet. Mithilfe der XmlParserContext-Klasse können DTD-Informationen zur Auflösung von Entitäten übergeben sowie Standardattribute hinzugefügt werden.

Wenn die ValidationType-Eigenschaft gleich DTD oder Auto ist, ist der XmlParserContext-Konstruktor mit dem PUBLIC-Literal und dem SYSTEM-Literal erforderlich; außerdem ist eine interne DTD-Teilmenge erforderlich, und Entitäten müssen aufgelöst und Standardattribute hinzugefügt werden. Bei allen anderen Validierungstypen kann XmlParserContext ohne DTD-Eigenschaften bereitgestellt werden (z. B. bei Schemata). Alle zur Validierung des XML-Fragments verwendeten Schemata müssen entweder der XmlSchemaCollection hinzugefügt werden, oder es muss direkt innerhalb des XML-Fragments auf sie verwiesen werden. Der XmlParserContext wird zur Bereitstellung weiterer Informationen verwendet, die zum Analysieren von XML-Fragmenten erforderlich sind, z. B. Namespaceauflösung oder DTD-Informationen.

ArgumentException tritt ein, wenn die ValidationType-Eigenschaft auf DTD festgelegt ist und der XmlParserContext keine DTD-Eigenschaften enthält.

Beispiel

Im folgenden Codebeispiel wird der XmlValidatingReader verwendet, um XML-Fragmente zu lesen und in die Konsole zu schreiben.

Imports System
Imports System.Xml
 
Public Class Sample
  
   Overloads Public Shared Sub Main(args() As [String])
      Dim vr As New XmlValidatingReader("<element1> abc </element1>  <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, Nothing)
      While vr.Read()
         Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name)
      End While
   End Sub
   ' Main
End Class
' Sample
using System;
using System.Xml;

public class Sample 
{
  public static void Main (String[] args) 
  {
  XmlValidatingReader vr = new XmlValidatingReader("<element1> abc </element1>  <element2> qrt </element2> <?pi asldfjsd ?> <!-- comment -->", XmlNodeType.Element, null);
        while(vr.Read())
    Console.WriteLine("NodeType: {0} NodeName: {1}", vr.NodeType, vr.Name);
   }
}

Im folgenden Codebeispiel wird ein XML-Fragment unter Verwendung des XmlParserContext gelesen. Dadurch wird der erforderliche Namespace von XmlNamespaceManager bereitgestellt.

Imports System
Imports System.IO
Imports System.Xml
 
Public Class Sample
   
   Public Shared Sub Main()
      
      Dim xmlFrag As String = "<book><bk:genre>&n;</bk:genre></book>"
      Dim nt As New NameTable()
      Dim nsmanager As New XmlNamespaceManager(nt)
      ' Add a default namespace.
      nsmanager.AddNamespace(String.Empty, "www.microsoft.com")
      nsmanager.AddNamespace("bk", "www.microsoft.com/books")
      Dim internalContent As String = "<!ENTITY n 'novel'>"
      Dim context As New XmlParserContext(nt, nsmanager, "elem", Nothing, Nothing, internalContent, String.Empty, String.Empty, XmlSpace.None)
      Dim r As New XmlValidatingReader(xmlFrag, XmlNodeType.Element, context)
      r.ValidationType = ValidationType.None
      r.EntityHandling = EntityHandling.ExpandEntities
      While r.Read()
         Console.WriteLine("{0},{1},{2}", r.NodeType, r.Name, r.Value)
      End While 
   End Sub
   ' Main
End Class
' Sample
using System;
using System.IO;
using System.Xml;

public class Sample 
{
  public static void Main()
  {

      string xmlFrag = "<book><bk:genre>&n;</bk:genre></book>";
      NameTable nt = new NameTable();
      XmlNamespaceManager nsmanager = new XmlNamespaceManager(nt);
     // Add a default namespace.
     nsmanager.AddNamespace (string.Empty, "www.microsoft.com");
     nsmanager.AddNamespace ("bk", "www.microsoft.com/books");
     string internalContent = "<!ENTITY n 'novel'>";
     XmlParserContext context = new XmlParserContext(nt, nsmanager, "elem",null, null, internalContent, string.Empty,
string.Empty, XmlSpace.None);
     XmlValidatingReader r = new XmlValidatingReader(xmlFrag, XmlNodeType.Element, context);
     r.ValidationType = ValidationType.None;
     r.EntityHandling = EntityHandling.ExpandEntities;
     while(r.Read())
        Console.WriteLine("{0},{1},{2}",r.NodeType, r.Name, r.Value);

  }
}

Die Analyse von Fragmenten ist nicht möglich, wenn die ValidationType-Eigenschaft gleich DTD ist, da eine DTD definitionsgemäß das Laden des gesamten Dokuments erfordert, um die Validierung durchzuführen.

Siehe auch

Konzepte

Lesen von XML mit dem "XmlReader"

Weitere Ressourcen

Verwenden der "XmlReader"-Klasse