Freigeben über


Extrahieren von XML-Daten mit XPathNavigator

Es gibt verschiedene Möglichkeiten, ein XML-Dokument im Microsoft .NET Framework darzustellen. Dies umfasst die Verwendung eines String oder der Klassen XmlReader, XmlWriter, XmlDocument oder XPathDocument. Um das Verschieben zwischen diesen verschiedenen Darstellungen eines XML-Dokuments zu erleichtern, stellt die XPathNavigator Klasse eine Reihe von Methoden und Eigenschaften zum Extrahieren des XML-Codes als Objekt StringXmlReader oder XmlWriter Objekt bereit.

Konvertieren eines XPathNavigator-Elements in eine Zeichenfolge

Die OuterXml Eigenschaft der XPathNavigator Klasse wird verwendet, um das Markup des gesamten XML-Dokuments oder nur das Markup eines einzelnen Knotens und seiner untergeordneten Knoten abzurufen.

Hinweis

Die InnerXml-Eigenschaft ruft das Markup der einem Knoten untergeordneten Knoten ab.

Im folgenden Codebeispiel wird gezeigt, wie ein gesamtes XML-Dokument, das in einem XPathNavigator Objekt enthalten ist, als String gespeichert werden kann, sowie ein einzelner Knoten und seine untergeordneten Knoten.

Dim document As XPathDocument = New XPathDocument("input.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
  
' Save the entire input.xml document to a string.  
Dim xml As String = navigator.OuterXml  
  
' Now save the Root element and its child nodes to a string.  
navigator.MoveToChild(XPathNodeType.Element)  
Dim root As String = navigator.OuterXml  
XPathDocument document = new XPathDocument("input.xml");  
XPathNavigator navigator = document.CreateNavigator();  
  
// Save the entire input.xml document to a string.  
string xml = navigator.OuterXml;  
  
// Now save the Root element and its child nodes to a string.  
navigator.MoveToChild(XPathNodeType.Element);  
string root = navigator.OuterXml;  

Konvertieren eines XPathNavigator-Elements in einen XmlReader

Die ReadSubtree Methode wird verwendet, um den gesamten Inhalt eines XML-Dokuments oder nur eines einzelnen Knotens und seiner untergeordneten Knoten in ein XmlReader Objekt zu streamen.

Wenn das XmlReader Objekt mit dem aktuellen Knoten und seinen untergeordneten Knoten erstellt wird, wird die Eigenschaft XmlReader des ReadState Objekts auf Initial gesetzt. Wenn die Methode XmlReader des Read-Objekts zum ersten Mal aufgerufen wird, wird das XmlReader auf den aktuellen Knoten des XPathNavigator verschoben. Das neue XmlReader-Objekt liest weiter, bis das Ende des XML-Baums erreicht ist. An diesem Punkt gibt die Read Methode zurück false , und die XmlReader Eigenschaft des ReadState Objekts wird auf EndOfFilefestgelegt.

Die XPathNavigator Position des Objekts wird durch die Erstellung oder Bewegung des XmlReader Objekts unverändert. Die ReadSubtree Methode ist nur gültig, wenn sie auf einem Element oder Stammknoten positioniert ist.

Das folgende Beispiel zeigt, wie ein XmlReader Objekt abgerufen wird, das das gesamte XML-Dokument in einem XPathDocument Objekt sowie einen einzelnen Knoten und seine untergeordneten Knoten enthält.

Dim document As XPathDocument = New XPathDocument("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
  
' Stream the entire XML document to the XmlReader.  
Dim xml As XmlReader = navigator.ReadSubtree()  
  
While xml.Read()  
    Console.WriteLine(xml.ReadInnerXml())  
End While  
  
xml.Close()  
  
' Stream the book element and its child nodes to the XmlReader.  
navigator.MoveToChild("bookstore", "")  
navigator.MoveToChild("book", "")  
  
Dim book As XmlReader = navigator.ReadSubtree()  
  
While book.Read()  
    Console.WriteLine(book.ReadInnerXml())  
End While  
  
book.Close()  
XPathDocument document = new XPathDocument("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
  
// Stream the entire XML document to the XmlReader.  
XmlReader xml = navigator.ReadSubtree();  
  
while (xml.Read())  
{  
    Console.WriteLine(xml.ReadInnerXml());  
}  
  
xml.Close();  
  
// Stream the book element and its child nodes to the XmlReader.  
navigator.MoveToChild("bookstore", "");  
navigator.MoveToChild("book", "");  
  
XmlReader book = navigator.ReadSubtree();  
  
while (book.Read())  
{  
    Console.WriteLine(book.ReadInnerXml());  
}  
  
book.Close();  

Im Beispiel wird die books.xml Datei als Eingabe verwendet.

<?xml version="1.0" encoding="utf-8" ?> 
<bookstore>
    <book genre="autobiography" publicationdate="1981-03-22" 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-11-17" 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-02-15" ISBN="1-861001-57-6">
        <title>The Gorgias</title>
        <author>
            <name>Plato</name>
        </author>
        <price>9.99</price>
    </book>
</bookstore>

Konvertieren eines XPathNavigator in einen XmlWriter

Die WriteSubtree Methode wird verwendet, um den gesamten Inhalt eines XML-Dokuments oder nur eines einzelnen Knotens und seiner untergeordneten Knoten in ein XmlWriter Objekt zu streamen.

Die XPathNavigator Position des Objekts wird durch die Erstellung des XmlWriter Objekts unverändert.

Das folgende Beispiel zeigt, wie ein XmlWriter Objekt abgerufen wird, das das gesamte XML-Dokument in einem XPathDocument Objekt sowie einen einzelnen Knoten und seine untergeordneten Knoten enthält.

Dim document As XPathDocument = New XPathDocument("books.xml")  
Dim navigator As XPathNavigator = document.CreateNavigator()  
  
' Stream the entire XML document to the XmlWriter.  
Dim xml As XmlWriter = XmlWriter.Create("newbooks.xml")  
navigator.WriteSubtree(xml)  
xml.Close()  
  
' Stream the book element and its child nodes to the XmlWriter.  
navigator.MoveToChild("bookstore", "")  
navigator.MoveToChild("book", "")  
  
Dim book As XmlWriter = XmlWriter.Create("book.xml")  
navigator.WriteSubtree(book)  
book.Close()  
XPathDocument document = new XPathDocument("books.xml");  
XPathNavigator navigator = document.CreateNavigator();  
  
// Stream the entire XML document to the XmlWriter.  
XmlWriter xml = XmlWriter.Create("newbooks.xml");  
navigator.WriteSubtree(xml);  
xml.Close();  
  
// Stream the book element and its child nodes to the XmlWriter.  
navigator.MoveToChild("bookstore", "");  
navigator.MoveToChild("book", "");  
  
XmlWriter book = XmlWriter.Create("book.xml");  
navigator.WriteSubtree(book);  
book.Close();  

In dem Beispiel nimmt man die books.xml Datei, die zuvor in diesem Thema gefunden wurde, als Eingabe.

Siehe auch