XNode.ReadFrom(XmlReader) Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
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
Parametreler
Döndürülenler
Okuyucudan XNode okunan düğümü ve alt düğümlerini içeren. Düğümün çalışma zamanı türü, okuyucuda karşılaşılan ilk düğümün düğüm türüne (NodeType) göre belirlenir.
Özel durumlar
XmlReader, tanınan bir düğüm türüne konumlandırılmaz.
Temel alınan XmlReader bir özel durum oluşturur.
Örnekler
Bu örnek, Source.xml adlı aşağıdaki XML dosyasını kullanır:
<?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>
Aşağıdaki örnek, LINQ sorgusu kullanarak özel ekseni kullanan ReadFrom ve sorgulayan bir özel eksen yöntemi oluşturur:
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
Bu örnek aşağıdaki çıkışı oluşturur:
bbb
ccc
Açıklamalar
Bu yöntemi kullanarak bir düğüm koleksiyonu döndüren ve düğüm okuyucudan okundukça her düğümü veren bir yöntem yazabilirsiniz. Bu yöntem, çok küçük bir bellek ayak izi ile rastgele büyük XML dosyalarını işlemenizi sağlar.
Bu yönteme geçirdiğiniz okuyucu özel durumlar atabilir. ReadFrom okuyucu tarafından atılan tüm özel durumları yakalamaz; işlenmeyen özel durumlar adlı ReadFromkoda kadar kabarır. Özellikle, kodunuz işlemeye XmlExceptionhazır olmalıdır.
Daha karmaşık bir belgenin akışının nasıl yapılacağını gösteren bir örnek için bkz. Üst bilgi bilgilerine erişimle XML parçalarının akışını yapma.
gibi OrderBybazı standart sorgu işleçleri, kaynaklarını yineler, tüm verileri toplar, sıralar ve son olarak dizideki ilk öğeyi verir. İlk öğeyi sağlamadan önce kaynağını oluşturan bir sorgu işleci kullanırsanız, küçük bir bellek ayak izi tutmazsınız.
Bellekte küçük bir ayak izi tutarken son derece büyük XML belgelerini dönüştürmek için LINQ to XML kullanma örneği için bkz. Büyük XML belgelerinin akış dönüşümünü gerçekleştirme.