XNode.ReadFrom(XmlReader) Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
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
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.