Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Mit der XmlValidatingReader-Klasse können XML-Fragmente gelesen werden, indem eine gegebene Zeichenfolge als Fragment von XML analysiert wird. Dadurch können die Regeln der Stammebene für wohlgeformte XML-Dokumente umgangen werden.
Die XmlValidatingReader-Methode entspricht bei der Überprüfung XmlTextReader, der zur Konstruktion von Dokumentfragmenten verwendet wird. Der Parameter XmlNodeType bestimmt, wie die jeweilige Zeichenfolge bearbeitet wird. In der folgenden Tabelle wird die Bearbeitung jedes Typs dargestellt.
| Typ | Fragmentinhalt |
|---|---|
| Element | Jegliche gültigen Elementinhalte, z. B. Kombinationen aus Elementen, Kommentaren, Verarbeitungsanweisungen, CDATA und Text. |
| Attribut | Der Wert eines Attributs. |
| Dokument | Der Inhalt eines ganzen XML-Dokuments. Dieser Typ implementiert die auf Stammebene gültigen Regeln. |
Entitätsverweise im Inhalt von Elementen oder Attributen werden entsprechend dem EntityHandling-Flag verarbeitet. Mit Hilfe der XmlParserContext-Klasse können DTD-Informationen zur Auflösung von Entitäten übergeben sowie Standardattribute hinzugefügt werden. Die Übergabe einer anderen XmlNodeType-Enumeration löst eine ArgumentException aus.
Wenn die ValidationType-Eigenschaft auf DTD oder Auto gesetzt ist, wird der XmlParserContext-Konstruktor erforderlich, der die öffentliche, literale, systemliterale und interne DTD-Untergruppe enthält. Außerdem müssen Entitäten aufgelöst und Standardattribute hinzugefügt werden. Bei allen anderen Überprüfungstypen kann XmlParserContext ohne DTD-Eigenschaften bereitgestellt werden (z. B. bei Schemas). Alle zur Überprüfung des XML-Fragments verwendeten Schemas müssen entweder zur XmlSchemaCollection hinzugefügt werden oder es muss direkt innerhalb des XML-Fragments auf sie verwiesen werden. XmlParserContext wird zur Bereitstellung weiterer Informationen, z. B. Namespaceauflösung, DTD-Informationen usw., verwendet, die zur Bearbeitung von XML-Fragmenten erforderlich sind.
ArgumentException tritt auf, wenn die ValidationType-Eigenschaft auf DTD gesetzt ist und XmlParserContext keine DTD-Eigenschaften enthält.
Im folgenden Beispiel wird XmlValidatingReader verwendet, um XML-Fragmente zu lesen und auf der Konsole auszugeben.
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
[C#]
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 von 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
[C#]
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 des Fragments ist nicht möglich, wenn die ValidationType-Eigenschaft auf DTD gesetzt ist, da eine DTD definitionsgemäß das Laden des gesamten Dokuments erfordert, um die Überprüfung durchzuführen.
Siehe auch
XML-Gültigkeitsprüfung mit XmlValidatingReader | Gültigkeitsprüfung von XML mit Schemas | XmlSchemaCollection als Schemacache | XmlParserContext-Klasse