Бөлісу құралы:


Извлечение XML-данных с помощью XPathNavigator

Существует несколько различных способов представления XML-документа в Microsoft .NET Framework. К ним относятся использование Stringили использование XmlReaderклассов , XmlWriterXmlDocumentили XPathDocument классов. Чтобы упростить перемещение между этими различными представлениями XML-документа, XPathNavigator класс предоставляет ряд методов и свойств для извлечения XML в виде StringXmlReader объекта или XmlWriter объекта.

Преобразовать XPathNavigator в строку

Свойство OuterXmlXPathNavigator класса используется для получения разметки всего XML-документа или просто разметки одного узла и дочерних узлов.

Замечание

Свойство InnerXml возвращает разметку только дочерних узлов узла.

В следующем примере кода показано, как сохранить весь XML-документ, содержащийся в XPathNavigator объекте как Stringобъект, а также один узел и его дочерние узлы.

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;

Преобразуйте XPathNavigator в XmlReader

Метод ReadSubtree используется для потоковой передачи всего содержимого XML-документа или только одного узла и его дочерних узлов в XmlReader объект.

XmlReader При создании объекта с текущим узлом и дочерними узлами XmlReader свойство объекта ReadState имеет значение Initial. Когда метод XmlReader объекта Read вызывается в первый раз, XmlReader перемещается на текущий узел XPathNavigator. Новый XmlReader объект продолжает читаться до конца XML-дерева. На этом этапе метод Read возвращает false, а свойству XmlReader объекта ReadState присваивается значение EndOfFile.

Позиция XPathNavigator объекта не изменяется путем создания или перемещения XmlReader объекта. Метод ReadSubtree действителен только при расположении на элементе или корневом узле.

В следующем примере показано, как получить XmlReader объект, содержащий весь XML-документ в XPathDocument объекте, а также один узел и его дочерние узлы.

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();

Пример принимает файл books.xml в качестве входных данных.

<?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>

Преобразование XPathNavigator в XmlWriter

Метод WriteSubtree используется для потоковой передачи всего содержимого XML-документа или только одного узла и его дочерних узлов в XmlWriter объект.

Позиция XPathNavigator объекта не изменяется путем создания XmlWriter объекта.

В следующем примере показано, как получить XmlWriter объект, содержащий весь XML-документ в XPathDocument объекте, а также один узел и его дочерние узлы.

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();

Пример принимает файл, найденный books.xml ранее в этом разделе, в качестве входных данных.

См. также