XNode.ReadFrom(XmlReader) Metod

Definition

Skapar en XNode från en XmlReader.

public:
 static System::Xml::Linq::XNode ^ ReadFrom(System::Xml::XmlReader ^ reader);
public static System.Xml.Linq.XNode ReadFrom(System.Xml.XmlReader reader);
static member ReadFrom : System.Xml.XmlReader -> System.Xml.Linq.XNode
Public Shared Function ReadFrom (reader As XmlReader) As XNode

Parametrar

reader
XmlReader

En XmlReader placerad på noden för att läsa in i den här XNode.

Returer

En XNode som innehåller noden och dess underordnade noder som lästes från läsaren. Nodens körningstyp bestäms av nodtypen (NodeType) för den första noden som påträffades i läsaren.

Undantag

XmlReader är inte placerad på en identifierad nodtyp.

Det underliggande XmlReader genererar ett undantag.

Exempel

I det här exemplet används följande XML-fil med namnet Source.xml:

<?xml version="1.0" encoding="utf-8" ?>
<Root>
  <Child Key="01">
    <GrandChild>aaa</GrandChild>
  </Child>
  <Child Key="02">
    <GrandChild>bbb</GrandChild>
  </Child>
  <Child Key="03">
    <GrandChild>ccc</GrandChild>
  </Child>
</Root>

I följande exempel skapas en anpassad axelmetod som använder ReadFrom och sedan frågar den anpassade axeln med hjälp av en LINQ-fråga:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Xml.Linq;

class Program
{
    static IEnumerable<XElement> StreamRootChildDoc(string uri)
    {
        using (XmlReader reader = XmlReader.Create(uri))
        {
            reader.MoveToContent();
            
            // Parse the file and return each of the nodes.
            while (!reader.EOF)
            {
                if (reader.NodeType == XmlNodeType.Element && reader.Name == "Child")
                {
                    XElement el = XElement.ReadFrom(reader) as XElement;
                    if (el != null)
                        yield return el;
                }
                else
                {
                    reader.Read();
                }
            }
        }
    }

    static void Main(string[] args)
    {
        IEnumerable<string> grandChildData =
            from el in StreamRootChildDoc("Source.xml")
            where (int)el.Attribute("Key") > 1
            select (string)el.Element("GrandChild");

        foreach (string str in grandChildData)
            Console.WriteLine(str);
    }
}
Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml
Imports System.Xml.Linq

Module Program
    Iterator Function StreamRootChildDoc(ByVal uri As String) As IEnumerable(Of XElement)

        Using reader As XmlReader = XmlReader.Create(uri)
            reader.MoveToContent()

            ' Parse the file and return each of the nodes.
            While Not reader.EOF

                If reader.NodeType = XmlNodeType.Element AndAlso reader.Name = "Child" Then
                    Dim el As XElement = TryCast(XElement.ReadFrom(reader), XElement)
                    If el IsNot Nothing Then Yield el
                Else
                    reader.Read()
                End If
            End While
        End Using
    End Function

    Sub Main(args As String())

        Dim grandChildData As IEnumerable(Of String) =
            From el In StreamRootChildDoc("Source.xml")
            Where CInt(el.Attribute("Key")) > 1
            Select CStr(el.Element("GrandChild"))

        For Each str As String In grandChildData
            Console.WriteLine(str)
        Next

    End Sub

End Module

Det här exemplet genererar följande utdata:

bbb
ccc

Kommentarer

Du kan använda den här metoden för att skriva en metod som returnerar en samling noder, vilket ger varje nod när noden läse från läsaren. Med den här metoden kan du bearbeta godtyckligt stora XML-filer med ett mycket litet minnesavtryck.

Läsaren som du skickar till den här metoden kan utlösa undantag. ReadFrom fångar inte alla undantag som genereras av läsaren. de ohanterade undantagen bubblar upp till koden som heter ReadFrom. I synnerhet bör koden vara beredd att hantera XmlException.

Ett exempel på hur du strömmar ett mer komplext dokument finns i Så här strömmar du XML-fragment med åtkomst till rubrikinformation.

Vissa vanliga frågeoperatorer, till exempel OrderBy, itererar sin källa, samlar in alla data, sorterar dem och ger slutligen det första objektet i sekvensen. Om du använder en frågeoperator som materialiserar källan innan du ger det första objektet behåller du inte ett litet minnesfotavtryck.

Ett exempel på hur du använder LINQ till XML för att transformera extremt stora XML-dokument samtidigt som ett litet minnesavtryck bibehålls finns i Så här utför du direktuppspelning av stora XML-dokument.

Gäller för

Se även