Aracılığıyla paylaş


System.Xml.XmlReader sınıfı

Bu makale, bu API'nin başvuru belgelerine ek açıklamalar sağlar.

XmlReader belge veya akıştaki XML verilerine ileri-tek yönlü, salt okunur erişim sağlar. Bu sınıf, W3C Genişletilebilir Biçimlendirme Dili (XML) 1.0 (dördüncü sürüm) ve XML 1.0 'daki Ad Alanları (üçüncü sürüm) önerilerine uygundur.

XmlReader yöntemleri, XML verileri arasında gezinmenizi ve bir düğümün içeriğini okumanızı sağlar. sınıfının özellikleri, okuyucunun konumlandırıldığı geçerli düğümün değerini yansıtır. ReadState Özellik değeri, XML okuyucusunun geçerli durumunu gösterir. Örneğin, özellik ReadState.Initial yöntemi tarafından XmlReader.Read olarak ve ReadState.Closed yöntemi tarafından XmlReader.Close olarak ayarlanır. XmlReader ayrıca bir DTD veya şemaya göre veri uyumluluğu denetimleri ve doğrulama sağlar.

XmlReader verileri almak için bir çekme modeli kullanır. Bu model:

  • Doğal ve kolay anlaşılır bir şekilde yukarıdan aşağıya doğru prosedürel iyileştirmeyle durum yönetimini basitleştirir.
  • Birden çok giriş akışını ve katmanlamasını destekler.
  • İstemcinin ayrıştırıcıya dizenin doğrudan yazıldığı bir arabellek vermesini sağlar ve bu nedenle ek bir dize kopyası gerekliliğini önler.
  • Seçmeli işlemeyi destekler. İstemci, öğeleri atlayabilir ve uygulamayı ilgilendiren öğeleri işleyebilir. Ayrıca, XML akışının nasıl işlendiğini (örneğin, normalleştirme) yönetmek için özellikleri önceden ayarlayabilirsiniz.

XML okuyucu oluşturma

Create yöntemini kullanarak bir XmlReader örneği oluşturun.

.NET XmlReader sınıfının somut uygulamalarını, XmlTextReader, XmlNodeReader ve XmlValidatingReader sınıfları gibi, sağlasa da, özel sınıfları yalnızca şu senaryolarda kullanmanızı öneririz:

  • Bir nesneden XmlNode XML DOM alt ağacını okumak istediğinizde sınıfını XmlNodeReader kullanın. (Ancak, bu sınıf DTD veya şema doğrulamayı desteklemez.)
  • İstek üzerine varlıkları genişletmeniz gerekiyorsa, metin içeriğinizin normalleştirilmesini veya varsayılan özniteliklerin döndürülmesini istemiyorsanız sınıfını XmlTextReader kullanın.

XML okuyucuda etkinleştirmek istediğiniz özellik kümesini belirtmek için yöntemine System.Xml.XmlReaderSettings bir Create nesne geçirin. Aynı işleve sahip birden çok okuyucu oluşturmak için tek System.Xml.XmlReaderSettings bir nesne kullanabilir veya nesneyi değiştirerek farklı özelliklere sahip yeni bir okuyucu oluşturabilirsiniz System.Xml.XmlReaderSettings . Ayrıca mevcut bir okuyucuya kolayca özellik ekleyebilirsiniz.

Nesne System.Xml.XmlReaderSettings kullanmıyorsanız, varsayılan ayarlar kullanılır. Create Ayrıntılar için başvuru sayfasına bakın.

XmlReader XML ayrıştırma hatası durumunda XmlException atar. İstisna fırlatıldıktan sonra okuyucunun durumu öngörülemez. Örneğin, bildirilen düğüm türü geçerli düğümün gerçek düğüm türünden farklı olabilir. Okuyucunun ReadState hata durumunda olup olmadığını denetlemek için özelliğini kullanın.

XML verilerini doğrulama

XML belgesinin yapısını ve öğe ilişkilerini, veri türlerini ve içerik kısıtlamalarını tanımlamak için, belge türü tanımı (DTD) veya XML Şema tanım dili (XSD) şeması kullanırsınız. Xml belgesi W3C XML 1.0 Önerisi tarafından tanımlanan tüm sözdizimsel gereksinimleri karşılıyorsa iyi biçimlendirilmiş olarak kabul edilir. İyi biçimlendirilmişse ve DTD veya şeması tarafından tanımlanan kısıtlamalara uygunsa geçerli kabul edilir. (Bkz. W3C XML Şema Bölüm 1: Yapılar ve W3C XML Şema Bölüm 2: Veri türleri önerileri.) Bu nedenle, tüm geçerli XML belgeleri iyi biçimlendirilmiş olsa da, tüm iyi biçimlendirilmiş XML belgeleri geçerli değildir.

Verileri bir DTD, satır içi XSD Şeması veya bir nesnede (önbellek) depolanan bir XmlSchemaSet XSD Şemasına göre doğrulayabilirsiniz; bu senaryolar başvuru sayfasında açıklanmıştır Create . XmlReader XML-Data Azaltılmış (XDR) şema doğrulamayı desteklemez.

XmlReaderSettings sınıfında, XmlReader örneğinin hangi doğrulama türünü (varsa) desteklediğini belirtmek için aşağıdaki ayarları kullanırsınız.

XmlReaderSettings adlı üyeyi kullanın Belirtmek için
DtdProcessing özelliği DTD işlemeye izin verilip verilmeyeceği. Varsayılan değer, DTD işlemeye izin vermemektir.
ValidationType özelliği Okuyucunun verileri doğrulaması gerekip gerekmediği ve gerçekleştirilecek doğrulama türü (DTD veya şema). Varsayılan olarak veri doğrulaması yoktur.
ValidationEventHandler etkinlik Doğrulama olayları hakkında bilgi almak için bir olay işleyicisi. Bir olay işleyici sağlanmazsa, ilk doğrulama hatasında bir XmlException atılır.
ValidationFlags özelliği Enumerasyon üyeleri aracılığıyla XmlSchemaValidationFlags ek doğrulama seçenekleri:

- AllowXmlAttributes-- Şemada tanımlanmamış olsalar bile örnek belgelerde XML özniteliklerine (xml:*) izin verin. Öznitelikler, veri türlerine göre doğrulanır. Belirli senaryolar için kullanılacak ayar hakkında bilgi almak üzere XmlSchemaValidationFlags başvuru sayfasına bakın. (Varsayılan olarak devre dışıdır.)
- ProcessIdentityConstraints--Doğrulama sırasında karşılaşılan işlem kimliği kısıtlamaları (xs:ID, xs:IDREFxs:key, , xs:keyref, xs:unique) . (Varsayılan olarak etkindir.)
- ProcessSchemaLocation -- xsi:schemaLocation veya xsi:noNamespaceSchemaLocation özniteliği tarafından belirtilen işlemleri şemaları işleyin. (Varsayılan olarak etkindir.)
- ProcessInlineSchema-- Doğrulama sırasında satır içi XML Şemalarını işleyin. (Varsayılan olarak devre dışıdır.)
- ReportValidationWarnings--Doğrulama uyarısı oluşursa olayları bildirin. Genellikle belirli bir öğe veya özniteliğin doğrulanması için DTD veya XML Şeması olmadığında bir uyarı verilir. ValidationEventHandler, bildirim için kullanılır. (Varsayılan olarak devre dışıdır.)
Schemas XmlSchemaSet Doğrulama için kullanılacak.
XmlResolver özelliği XmlResolver Dış kaynakları çözümlemek ve bunlara erişmek için. Bu, DTD ve şemalar gibi dış varlıkları ve XML Şemasında bulunan herhangi bir xs:include veya xs:import öğeyi içerebilir. Eğer bir XmlResolver belirtmezseniz, XmlReader kullanıcı kimlik bilgileri olmadan varsayılan bir XmlUrlResolver kullanır.

Veri uyumluluğu

yöntemi tarafından Create oluşturulan XML okuyucuları varsayılan olarak aşağıdaki uyumluluk gereksinimlerini karşılar:

  • Yeni satırlar ve öznitelik değeri W3C XML 1.0 Önerisine göre normalleştirilir.

  • Tüm varlıklar otomatik olarak genişletilir.

  • Belge türü tanımında bildirilen varsayılan öznitelikler, okuyucu doğrulamadığında bile her zaman eklenir.

  • Doğru XML ad alanı URI'sine eşlenmiş XML ön eki bildirimine izin verilir.

  • Tek bir NotationType öznitelik bildirimindeki ve tek bir NmTokens öznitelik bildirimindeki Enumeration gösterim adları farklıdır.

Etkinleştirmek istediğiniz uyumluluk denetimlerinin türünü belirtmek için şu XmlReaderSettings özellikleri kullanın:

Bu XmlReaderSettings özelliği kullan İçin Varsayılan
CheckCharacters özelliği Aşağıdakiler için denetimleri etkinleştirin veya devre dışı bırakın:

- Karakterler, W3C XML 1.0 Önerisi'nin 2,2 Karakter bölümünde tanımlanan yasal XML karakterleri aralığındadır.
- Tüm XML adları, W3C XML 1.0 Önerisi'nin 2.3 Ortak İlgili Yapılar bölümünde tanımlandığı gibi geçerlidir.

Bu özellik (varsayılan) olarak ayarlandığında true , XmlException XML dosyası geçersiz karakterler veya geçersiz XML adları içeriyorsa (örneğin, öğe adı bir sayı ile başlar) bir özel durum oluşturulur.
Karakter ve ad denetimi etkinleştirilir.

CheckCharacters ayarını false olarak ayarlamak, karakter varlığı başvuruları için karakter denetimini kapatır. Okuyucu metin verilerini işliyorsa, xml adlarının bu ayardan bağımsız olarak her zaman geçerli olup olmadığını denetler. Not: XML 1.0 önerisi, bir DTD mevcut olduğunda belge düzeyinde uyumluluk gerektirir. Bu nedenle, okuyucu ConformanceLevel.Fragment desteği verecek şekilde yapılandırılmışsa, ancak XML verileri bir belge türü tanımı (DTD) içeriyorsa, bir XmlException oluşturulur.
ConformanceLevel özelliği Zorunlu kılınacak uyumluluk düzeyini seçin:

- Document. İyi biçimlendirilmiş bir XML 1.0 belgesinin kurallarına uygundur.
- Fragment. Dış ayrıştırılmış varlık olarak kullanılabilecek iyi biçimlendirilmiş bir belge parçasının kurallarına uyar.
- Auto. Okuyucunun karar verdiği düzeye uygundur.

Veriler uyumlu değilse bir XmlException özel durum oluşturulur.
Document

Geçerli düğüm, XML okuyucunun şu anda konumlandırıldığı XML düğümüdür. Tüm XmlReader yöntemler bu düğümle ilgili işlemler gerçekleştirir ve tüm XmlReader özellikler geçerli düğümün değerini yansıtır.

Aşağıdaki yöntemler, düğümler arasında gezinmeyi ve verileri ayrıştırmayı kolaylaştırır.

Bu XmlReaderSettings yöntemi kullanın İçin
Read İlk düğümü okuyun ve akışta sırayla her seferinde bir düğüm ilerleyin. Bu tür çağrılar genellikle bir while döngü içinde gerçekleştirilir.

Geçerli düğümün türünü (örneğin, öznitelik, açıklama, öğe vb.) almak için NodeType özelliğini kullanın.
Skip Geçerli düğümün alt öğelerini atlayın ve sonraki düğüme geçin.
MoveToContent ve MoveToContentAsync İçerik olmayan düğümleri atlayın ve sonraki içerik düğümüne veya dosyanın sonuna geçin.

İçerik olmayan düğümler ProcessingInstruction, DocumentType, Comment, Whitespace ve SignificantWhitespace şeklindedir.

İçerik düğümleri, boşluk olmayan metin, CDATA, EntityReference ve EndEntity içerir.
ReadSubtree Bir öğeyi ve tüm alt öğelerini okuyun ve XmlReader olarak ayarlanmış yeni bir ReadState.Initial örneği geri döndürün.

Bu yöntem, XML öğeleri çevresinde sınırlar oluşturmak için kullanışlıdır; örneğin, verileri işlenmek üzere başka bir bileşene geçirmek ve bileşenin erişebileceği veri miktarını sınırlamak istiyorsanız.

Bir metin akışında tek seferde bir düğümde gezinme ve her düğümün türünü görüntüleme örneği için referans sayfasına bakın.

Aşağıdaki bölümlerde öğeler, öznitelikler ve yazılan veriler gibi belirli veri türlerini nasıl okuyabileceğiniz açıklanmaktadır.

XML öğelerini okuma

Aşağıdaki tabloda, sınıfın öğeleri işlemek için sağladığı yöntemler ve özellikler XmlReader listelenmiştir. XmlReader öğesinde konumlandırıldıktan sonra, gibi Namedüğüm özellikleri öğe değerlerini yansıtır. Aşağıda açıklanan üyelere ek olarak, sınıfın genel yöntem ve özelliklerinden XmlReader herhangi biri de öğeleri işlemek için kullanılabilir. Örneğin, bir öğenin içeriğini okumak için yöntemini kullanabilirsiniz ReadInnerXml .

Uyarı

Başlangıç etiketleri, bitiş etiketleri ve boş öğe etiketleri tanımları için W3C XML 1.0 Önerisi'nin 3.1 . bölümüne bakın.

XmlReader adlı üyeyi kullanın İçin
IsStartElement yöntemi Geçerli düğümün başlangıç etiketi mi yoksa boş öğe etiketi mi olduğunu denetleyin.
ReadStartElement yöntemi Geçerli düğümün bir öğe olduğunu kontrol edin ve okuyucuyu sonraki düğüme ilerletin (önce IsStartElement ardından Read çağrılır).
ReadEndElement yöntemi Geçerli düğümün bir bitiş etiketi olup olmadığını denetleyin ve okuyucuyu sonraki düğüme ilerletin.
ReadElementString yöntemi Yalnızca metin öğesini okuyun.
ReadToDescendant yöntemi XML okuyucusunu, verilen isme sahip bir sonraki alt (çocuk) öğeye ilerlet.
ReadToNextSibling yöntemi XML okuyucuyu belirtilen ada sahip bir sonraki eşdüzey öğeye ilerlet.
IsEmptyElement özelliği Geçerli öğenin bir bitiş öğesi etiketi olup olmadığını denetleyin. Örneğin:

- <item num="123"/> (IsEmptyElementtrue vardır)
- <item num="123"> </item> (IsEmptyElement öğesi false olmasına rağmen içerik boş.)

Öğelerin metin içeriğini okuma örneği için yöntemine ReadString bakın. Aşağıdaki örnek bir while döngü kullanarak öğeleri işler.

while (reader.Read()) {
  if (reader.IsStartElement()) {
    if (reader.IsEmptyElement)
                {
                    Console.WriteLine($"<{reader.Name}/>");
                }
                else {
      Console.Write("<{0}> ", reader.Name);
      reader.Read(); // Read the start tag.
      if (reader.IsStartElement())  // Handle nested elements.
        Console.Write("\r\n<{0}>", reader.Name);
      Console.WriteLine(reader.ReadString());  //Read the text content of the element.
    }
  }
}
While reader.Read()
  If reader.IsStartElement() Then
    If reader.IsEmptyElement Then
      Console.WriteLine("<{0}/>", reader.Name)
    Else
      Console.Write("<{0}> ", reader.Name)
      reader.Read() ' Read the start tag.
      If reader.IsStartElement() Then ' Handle nested elements.
        Console.Write(vbCr + vbLf + "<{0}>", reader.Name)
      End If
      Console.WriteLine(reader.ReadString()) 'Read the text content of the element.
    End If
  End If
End While

XML özniteliklerini okuma

XML öznitelikleri en yaygın olarak öğelerde bulunur, ancak XML bildirimi ve belge türü düğümlerinde de bunlara izin verilir.

Bir öğe düğümünde konumlandırıldığında yöntemi, MoveToAttribute öğesinin öznitelik listesinden geçmenizi sağlar. çağrıldıktan sonra MoveToAttribute , Namegibi NamespaceURIdüğüm özelliklerinin ve Prefix özniteliğin ait olduğu öğenin özelliklerini değil, bu özniteliğin özelliklerini yansıttığını unutmayın.

sınıfı, XmlReader öğelerdeki öznitelikleri okumak ve işlemek için bu yöntemleri ve özellikleri sağlar.

XmlReader adlı üyeyi kullanın İçin
HasAttributes özelliği Geçerli düğümün öznitelikleri olup olmadığını kontrol edin.
AttributeCount özelliği Geçerli öğedeki öznitelik sayısını alın.
MoveToFirstAttribute yöntemi Bir öğedeki ilk özniteliğe gitme.
MoveToNextAttribute yöntemi Bir öğede sonraki özniteliğe gitme.
MoveToAttribute yöntemi Belirtilen bir özniteliğe gitme.
GetAttribute yöntem veya Item[] özellik Belirtilen özniteliğin değerini alın.
IsDefault özelliği Geçerli düğümün DTD veya şemada tanımlanan varsayılan değerden oluşturulmuş bir öznitelik olup olmadığını denetleyin.
MoveToElement yöntemi Geçerli özniteliğin sahibi olan öğeye gitme. Öznitelikleri arasında gezindikten sonra bir öğeye dönmek için bu yöntemi kullanın.
ReadAttributeValue yöntemi Öznitelik değerini bir veya daha fazla Text, EntityReferenceveya EndEntity düğümde ayrıştırın.

Öznitelikleri işlemek için genel XmlReader yöntem ve özelliklerden herhangi biri de kullanılabilir. Örneğin, XmlReader bir öznitelik üzerine konumlandırıldıktan sonra, Name ve Value özellikleri bu özniteliğin değerlerini yansıtır. Özniteliğin değerini almak için içerik Read yöntemlerinden herhangi birini de kullanabilirsiniz.

Bu örnek, bir öğedeki AttributeCount tüm özniteliklerde gezinmek için özelliğini kullanır.

// Display all attributes.
if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  for (int i = 0; i < reader.AttributeCount; i++) {
    Console.WriteLine($"  {reader[i]}");
  }
  // Move the reader back to the element node.
  reader.MoveToElement();
}
' Display all attributes.
If reader.HasAttributes Then
  Console.WriteLine("Attributes of <" + reader.Name + ">")
  Dim i As Integer
  For i = 0 To (reader.AttributeCount - 1)
    Console.WriteLine("  {0}", reader(i))
  Next i
  ' Move the reader back to the element node.
  reader.MoveToElement() 
End If

Bu örnek, öznitelikler arasında gezinmek için döngüdeki MoveToNextAttribute yöntemini kullanırwhile.

if (reader.HasAttributes) {
  Console.WriteLine("Attributes of <" + reader.Name + ">");
  while (reader.MoveToNextAttribute()) {
    Console.WriteLine($" {reader.Name}={reader.Value}");
  }
  // Move the reader back to the element node.
  reader.MoveToElement();
}
If reader.HasAttributes Then
  Console.WriteLine("Attributes of <" + reader.Name + ">")
  While reader.MoveToNextAttribute()
    Console.WriteLine(" {0}={1}", reader.Name, reader.Value)
  End While
  ' Move the reader back to the element node.
  reader.MoveToElement()
End If

XML bildirim düğümlerindeki öznitelikleri okuma

XML okuyucu bir XML bildirim düğümünde konumlandırıldığında, Value özelliği sürüm, tek başına ve kodlama bilgilerini tek bir dize olarak döndürür. XmlReader yöntemi, Create sınıfı ve XmlTextReader sınıfı tarafından oluşturulan nesneler, sürüm, tek başına çalışma ve kodlama niteliklerini öznitelik olarak sunar.

Belge türü düğümlerindeki öznitelikleri okuma

XML okuyucu bir belge türü düğümünde konumlandırıldığında, GetAttribute yöntemi ve Item[] özelliği, SYSTEM ve PUBLIC değişmez değerleri için değerleri döndürmek amacıyla kullanılabilir. Örneğin, çağrısı reader.GetAttribute("PUBLIC") PUBLIC değerini döndürür.

Yönerge düğümlerini işlemeyle ilgili öznitelikleri okuma

XmlReader bir işleme yönerge düğümünde konumlandırıldığında, Value özelliği metin içeriğinin tamamını döndürür. İşleme yönerge düğümündeki öğeler öznitelik olarak değerlendirilmez. GetAttribute veya MoveToAttribute yöntemiyle okunamaz.

XML içeriğini okuma

XmlReader sınıfı, xml dosyasından içerik okuyan ve içeriği dize değerleri olarak döndüren aşağıdaki üyeleri içerir. (CLR türlerini döndürmek için bkz . CLR türlerine dönüştürme.)

XmlReader adlı üyeyi kullanın İçin
Value özelliği Geçerli düğümün metin içeriğini alın. Döndürülen değer düğüm türüne bağlıdır; Value ayrıntılar için başvuru sayfasına bakın.
ReadString yöntemi Bir öğenin veya metin düğümünün içeriğini dize olarak alın. Bu yöntem, yönergeleri ve açıklamaları işlemeyi durdurur.

Bu yöntemin belirli düğüm türlerini nasıl işlediği hakkında ayrıntılı bilgi için başvuru sayfasına bakın ReadString .
ReadInnerXml ve ReadInnerXmlAsync yöntemleri Mevcut düğümün, işaretleme dahil, başlangıç ve bitiş etiketleri hariç olmak üzere tüm içeriğini alın. Örneğin, şu şekilde:

<node>this<child id="123"/></node>

ReadInnerXml döndürür:

this<child id="123"/>
ReadOuterXml ve ReadOuterXmlAsync yöntemleri İşaretlemesi ve başlangıç/bitiş etiketleri dahil olmak üzere geçerli düğümün ve alt öğelerinin tüm içeriğini alın. Örneğin, şu şekilde:

<node>this<child id="123"/></node>

ReadOuterXml döndürür:

<node>this<child id="123"/></node>

CLR türlerine dönüştürme

XML verilerini okumak ve değerleri dizeler yerine ortak dil çalışma zamanı (CLR) türleri olarak döndürmek için sınıfın üyelerini XmlReader (aşağıdaki tabloda listelenmiştir) kullanabilirsiniz. Bu üyeler, dize değerlerini el ile ayrıştırmak veya dönüştürmek zorunda kalmadan, gösterimde kodlama göreviniz için en uygun değerleri almanıza olanak tanır.

  • ReadElementContentAs yöntemleri yalnızca öğe düğümü türlerinde çağrılabilir. Bu yöntemler, alt öğeler veya karma içerik içeren öğelerde kullanılamaz. Çağrıldığında XmlReader , nesne başlangıç etiketini okur, öğe içeriğini okur ve ardından son öğe etiketinin dışına taşınır. İşleme yönergeleri ve açıklamalar yoksayılır ve öğeler genişletilir.

  • ReadContentAs yöntemleri, geçerli okuyucu konumunda metin içeriğini okur ve XML verilerinde ilişkili şema veya veri türü bilgisi yoksa, metin içeriğini istenen dönüş tipine çevirir. Metin, boşluk, önemli boşluk ve CDATA bölümleri birleştirilir. Açıklamalar ve işleme yönergeleri atlanır ve varlık başvuruları otomatik olarak çözümlenir.

sınıfı, XmlReaderW3C XML Şema Bölüm 2: Veri türleri önerisi tarafından tanımlanan kuralları kullanır.

Bu XmlReader yöntemi kullanın Bu CLR türünü döndürmek için
ReadContentAsBoolean ve ReadElementContentAsBoolean Boolean
ReadContentAsDateTime ve ReadElementContentAsDateTime DateTime
ReadContentAsDouble ve ReadElementContentAsDouble Double
ReadContentAsLong ve ReadElementContentAsLong Int64
ReadContentAsInt ve ReadElementContentAsInt Int32
ReadContentAsString ve ReadElementContentAsString String
ReadContentAs ve ReadElementContentAs returnType parametresiyle belirttiğiniz tür
ReadContentAsObject ve ReadElementContentAsObject XmlReader.ValueType özelliği tarafından belirtilen en uygun tür. Eşleştirme bilgileri için bkz. System.Xml Sınıflarında Tür Desteği

Bir öğe biçimi nedeniyle kolayca CLR türüne dönüştürülemiyorsa, başarılı bir dönüştürme sağlamak için şema eşlemesi kullanabilirsiniz. Aşağıdaki örnek, hire-date öğesini xs:date türüne dönüştürmek için bir .xsd dosyası kullanır ve ardından öğeyi ReadElementContentAsDateTime nesnesi olarak döndürmek için DateTime yöntemini kullanır.

Giriş (hireDate.xml):

<employee xmlns="urn:empl-hire">
    <ID>12365</ID>
    <hire-date>2003-01-08</hire-date>
    <title>Accountant</title>
</employee>

Schema (hireDate.xsd):

<?xml version="1.0"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="urn:empl-hire" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="employee">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="ID" type="xs:unsignedShort" />
        <xs:element name="hire-date" type="xs:date" />
        <xs:element name="title" type="xs:string" />
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Kod:

// Create a validating XmlReader object. The schema
// provides the necessary type information.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.Schemas.Add("urn:empl-hire", "hireDate.xsd");
using (XmlReader reader = XmlReader.Create("hireDate.xml", settings)) {

  // Move to the hire-date element.
  reader.MoveToContent();
  reader.ReadToDescendant("hire-date");

  // Return the hire-date as a DateTime object.
  DateTime hireDate = reader.ReadElementContentAsDateTime();
  Console.WriteLine($"Six Month Review Date: {hireDate.AddMonths(6)}");
}
' Create a validating XmlReader object. The schema 
' provides the necessary type information.
Dim settings As XmlReaderSettings = New XmlReaderSettings()
settings.ValidationType = ValidationType.Schema
settings.Schemas.Add("urn:empl-hire", "hireDate.xsd")
Using reader As XmlReader = XmlReader.Create("hireDate.xml", settings) 
  ' Move to the hire-date element.
  reader.MoveToContent()
  reader.ReadToDescendant("hire-date")

  ' Return the hire-date as a DateTime object.
  Dim hireDate As DateTime = reader.ReadElementContentAsDateTime()
  Console.WriteLine("Six Month Review Date: {0}", hireDate.AddMonths(6))
End Using

Çıktı:

Six Month Review Date:  7/8/2003 12:00:00 AM

Zaman uyumsuz programlama

Çoğu XmlReader yöntem, adlarının sonunda "Async" olan zaman uyumsuz karşılıklarına sahiptir. Örneğin, zaman uyumsuz eşdeğeri ReadContentAsObject şeklindedir ReadContentAsObjectAsync.

Aşağıdaki yöntemler zaman uyumsuz yöntem çağrılarıyla kullanılabilir:

Aşağıdaki bölümlerde, asenkron karşılıkları olmayan yöntemler için asenkron kullanım açıklanmaktadır.

ReadStartElement yöntemi

public static async Task ReadStartElementAsync(this XmlReader reader, string localname, string ns)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.Element)
    {
        throw new InvalidOperationException(reader.NodeType.ToString() + " is an invalid XmlNodeType");
    }
    if ((reader.LocalName == localname) && (reader.NamespaceURI == ns))
    {
        await reader.ReadAsync();
    }
    else
    {
        throw new InvalidOperationException("localName or namespace doesn’t match");
    }
}
<Extension()>
Public Async Function ReadStartElementAsync(reader As XmlReader, localname As String, ns As String) As Task
    If (Await reader.MoveToContentAsync() <> XmlNodeType.Element) Then
        Throw New InvalidOperationException(reader.NodeType.ToString() + " is an invalid XmlNodeType")
    End If

    If ((reader.LocalName = localname) And (reader.NamespaceURI = ns)) Then
        Await reader.ReadAsync()
    Else
        Throw New InvalidOperationException("localName or namespace doesn’t match")
    End If
End Function

ReadEndElement yöntemi

public static async Task ReadEndElementAsync(this XmlReader reader)
{
    if (await reader.MoveToContentAsync() != XmlNodeType.EndElement)
    {
        throw new InvalidOperationException();
    }
    await reader.ReadAsync();
}
<Extension()>
Public Async Function ReadEndElementAsync(reader As XmlReader) As task
    If (Await reader.MoveToContentAsync() <> XmlNodeType.EndElement) Then
        Throw New InvalidOperationException()
    End If
    Await reader.ReadAsync()
End Function

ReadToNextSibling yöntemi

public static async Task<bool> ReadToNextSiblingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the next sibling
    XmlNodeType nt;
    do
    {
        await reader.SkipAsync();
        if (reader.ReadState != ReadState.Interactive)
            break;
        nt = reader.NodeType;
        if (nt == XmlNodeType.Element &&
             ((object)localName == (object)reader.LocalName) &&
             ((object)namespaceURI ==(object)reader.NamespaceURI))
        {
            return true;
        }
    } while (nt != XmlNodeType.EndElement && !reader.EOF);
    
    return false;
}
<Extension()>
Public Async Function ReadToNextSiblingAsync(reader As XmlReader, localName As String, namespaceURI As String) As Task(Of Boolean)
    If (localName = Nothing Or localName.Length = 0) Then
        Throw New ArgumentException("localName is empty or null")
    End If

    If (namespaceURI = Nothing) Then
        Throw New ArgumentNullException("namespaceURI")
    End If

    ' atomize local name and namespace
    localName = reader.NameTable.Add(localName)
    namespaceURI = reader.NameTable.Add(namespaceURI)

    ' find the next sibling
    Dim nt As XmlNodeType
    Do

        Await reader.SkipAsync()
        If (reader.ReadState <> ReadState.Interactive) Then
            Exit Do
        End If
        nt = reader.NodeType
        If ((nt = XmlNodeType.Element) And
           ((CObj(localName) = CObj(reader.LocalName))) And
           (CObj(namespaceURI) = CObj(reader.NamespaceURI))) Then
            Return True
        End If
    Loop While (nt <> XmlNodeType.EndElement And (Not reader.EOF))

    Return False

End Function

ReadToFollowing yöntemi

public static async Task<bool> ReadToFollowingAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find element with that name
    while (await reader.ReadAsync())
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}
<Extension()>
Public Async Function ReadToFollowingAsync(reader As XmlReader, localName As String, namespaceURI As String) As Task(Of Boolean)
    If (localName = Nothing Or localName.Length = 0) Then
        Throw New ArgumentException("localName is empty or null")
    End If

    If (namespaceURI = Nothing) Then
        Throw New ArgumentNullException("namespaceURI")
    End If

    ' atomize local name and namespace
    localName = reader.NameTable.Add(localName)
    namespaceURI = reader.NameTable.Add(namespaceURI)

    ' find element with that name
    While (Await reader.ReadAsync())
        If ((reader.NodeType = XmlNodeType.Element) And
           (CObj(localName) = CObj(reader.LocalName)) And
           (CObj(namespaceURI) = CObj(reader.NamespaceURI))) Then
            Return True
        End If
    End While

    Return False
End Function

ReadToDescendant yöntemi

public static async Task<bool> ReadToDescendantAsync(this XmlReader reader, string localName, string namespaceURI)
{
    if (localName == null || localName.Length == 0)
    {
        throw new ArgumentException("localName is empty or null");
    }
    if (namespaceURI == null)
    {
        throw new ArgumentNullException("namespaceURI");
    }
    // save the element or root depth
    int parentDepth = reader.Depth;
    if (reader.NodeType != XmlNodeType.Element)
    {
        // adjust the depth if we are on root node
        if (reader.ReadState == ReadState.Initial)
        {
            parentDepth--;
        }
        else
        {
            return false;
        }
    }
    else if (reader.IsEmptyElement)
    {
        return false;
    }

    // atomize local name and namespace
    localName = reader.NameTable.Add(localName);
    namespaceURI = reader.NameTable.Add(namespaceURI);

    // find the descendant
    while (await reader.ReadAsync() && reader.Depth > parentDepth)
    {
        if (reader.NodeType == XmlNodeType.Element && ((object)localName == (object)reader.LocalName) && ((object)namespaceURI == (object)reader.NamespaceURI))
        {
            return true;
        }
    }
    return false;
}
<Extension()>
Public Async Function ReadToDescendantAsync(reader As XmlReader, localName As String, namespaceURI As String) As Task(Of Boolean)
    If (localName = Nothing Or localName.Length = 0) Then
        Throw New ArgumentException("localName is empty or null")
    End If

    If (namespaceURI = Nothing) Then
        Throw New ArgumentNullException("namespaceURI")
    End If

    ' save the element or root depth
    Dim parentDepth As Integer = reader.Depth
    If (reader.NodeType <> XmlNodeType.Element) Then
        ' adjust the depth if we are on root node
        If (reader.ReadState = ReadState.Initial) Then
            parentDepth -= 1
        Else
            Return False
        End If
    ElseIf (reader.IsEmptyElement) Then
        Return False
    End If
    ' atomize local name and namespace
    localName = reader.NameTable.Add(localName)
    namespaceURI = reader.NameTable.Add(namespaceURI)

    ' find the descendant
    While (Await reader.ReadAsync() And reader.Depth > parentDepth)
        If (reader.NodeType = XmlNodeType.Element And
           (CObj(localName) = CObj(reader.LocalName)) And
           (CObj(namespaceURI) = CObj(reader.NamespaceURI))) Then
            Return True
        End If
    End While

    Return False
End Function

Güvenlikle ilgili dikkat edilmesi gerekenler

sınıfıyla XmlReader çalışırken aşağıdakileri göz önünde bulundurun:

  • uygulamasından XmlReader atılan özel durumlar, uygulamanıza kabarmasını istemediğiniz yol bilgilerini açıklayabilir. Uygulamanızın özel durumları yakalaması ve uygun şekilde işlemesi gerekir.

  • Hizmet reddi sorunlarıyla ilgileniyorsanız veya güvenilmeyen kaynaklarla ilgileniyorsanız DTD işlemeyi etkinleştirmeyin. Varsayılan olarak, XmlReader yöntemi ile oluşturulan Create nesneleri için DTD işleme devre dışı bırakılmıştır.

    DTD işlemeyi etkinleştirdiyseniz, XmlSecureResolver öğesini kullanarak XmlReader'nin erişebileceği kaynakları kısıtlayabilirsiniz. Ayrıca uygulamanızı, XML işlemenin bellek ve zaman kısıtlaması olacak şekilde tasarlayabilirsiniz. Örneğin, ASP.NET uygulamanızda zaman aşımı sınırlarını yapılandırabilirsiniz.

  • XML verileri, şema dosyası gibi dış kaynaklara başvurular içerebilir. Varsayılan olarak, dış kaynaklar kullanıcı kimlik bilgileri olmayan bir XmlUrlResolver nesne kullanılarak çözümlenir. Aşağıdakilerden birini yaparak bunun güvenliğini daha da sağlayabilirsiniz:

  • Bir ProcessInlineSchema nesnenin ProcessSchemaLocation ve XmlReaderSettings doğrulama bayrakları varsayılan olarak ayarlanmamıştır. Bu, güvenilmeyen bir kaynaktan XML verilerini işlerken şema tabanlı saldırılara karşı korunmasına XmlReader yardımcı olur. Bu bayraklar ayarlandığında, XmlResolver nesnesi, XmlReaderSettings öğesindeki örnek belgede XmlReader karşılaşılan şema konumlarını çözümlemek için kullanılır. XmlResolver özelliği null olarak ayarlandığında, ProcessInlineSchema ve ProcessSchemaLocation doğrulama bayrakları ayarlansa bile, şema konumları çözümlenmez.

    Doğrulama sırasında eklenen şemalar yeni türler ekler ve doğrulanan belgenin doğrulama sonucunu değiştirebilir. Sonuç olarak dış şemalar yalnızca güvenilir kaynaklardan çözümlenmelidir.

    Yüksek kullanılabilirlik senaryolarında, belgenin büyük bir bölümü üzerinde kimlik kısıtlamaları olan bir şemaya karşı güvenilmeyen, büyük XML belgelerini doğrularken ProcessIdentityConstraints bayrağını devre dışı bırakmanızı öneririz. Bu bayrak varsayılan olarak etkindir.

  • XML verileri çok sayıda öznitelik, ad alanı bildirimi, iç içe öğeler vb. içerebilir ve bu işlem için çok fazla zaman gerektirir. adresine gönderilen girişin boyutunu sınırlamak için XmlReaderşunları yapabilirsiniz:

  • ReadValueChunk yöntemi, büyük veri akışlarını işlemek için kullanılabilir. Bu yöntem, değerin tamamı için tek bir dize ayırma yerine aynı anda az sayıda karakter okur.

  • Çok sayıda benzersiz yerel ad, ad alanı veya ön ek içeren bir XML belgesini okurken bir sorun oluşabilir. Eğer XmlReader öğesinden türetilen bir sınıf kullanıyorsanız ve her bir öğe için LocalName, Prefix veya NamespaceURI özelliklerinden birini çağırırsanız, döndürülen dize bir NameTable öğesine eklenir. tarafından tutulan koleksiyonun NameTable boyutu hiç küçülmez, bu da dize tanıtıcılarının sanal bellek sızıntısına yol açar. Bu durumu hafifletmenin bir yolu, NameTable sınıfından türeterek maksimum boyut kotasını zorunlu kılmaktır. (bir NameTable öğesinin kullanılmasını engellemenin hiçbir yolu yoktur veya NameTable dolduğunda değiştirmenin de hiçbir yolu yoktur). Diğer bir önlem, belirtilen özellikleri kullanmaktan kaçınmak ve bunun yerine mümkün olduğunca MoveToAttribute yöntemiyle IsStartElement yöntemini kullanmaktır; bu yöntemler dize döndürmez ve bu nedenle NameTable koleksiyonunun aşırı doldurulması sorununu önler.

  • XmlReaderSettings nesneleri, kullanıcı kimlik bilgileri gibi hassas bilgiler içerebilir. Güvenilmeyen bir bileşen, XmlReaderSettings nesnesini ve kullanıcı kimlik bilgilerini kullanarak verileri okumak için XmlReader nesneleri oluşturabilir. Nesneleri önbelleğe alırken XmlReaderSettings veya nesneyi bir bileşenden diğerine geçirirken XmlReaderSettings dikkatli olun.

  • Güvenilmeyen bir kaynaktan , NameTableve XmlNamespaceManager nesneleri gibi XmlResolverdestekleyici bileşenleri kabul etmeyin.