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 salt iletme, 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, özelliği yöntemi ve yöntemi tarafından XmlReader.Close olarak ayarlanır.XmlReader.ReadReadState.InitialReadState.Closed 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, yukarıdan aşağıya yordam iyileştirmesi ile 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 Bir örnek oluşturmak XmlReader için yöntemini kullanın.
.NET , ve XmlValidatingReader sınıfları gibi XmlNodeReaderXmlTextReadersınıfın XmlReader somut uygulamalarını 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 Create bir System.Xml.XmlReaderSettings 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.
XmlReaderXmlException xml ayrıştırma hataları oluşturur. Özel durum oluşturulduktan sonra okuyucunun durumu tahmin edilebilir değildir. Ö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 sağlam gereksinimleri karşılıyorsa iyi oluşturulmuş 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 Reduced (XDR) şema doğrulamayı desteklemez.
Örneğin desteklediği doğrulama türünü (varsa) XmlReader belirtmek için sınıfında aşağıdaki ayarları XmlReaderSettings kullanırsınız.
Bu üyeyi XmlReaderSettings kullan | Belirtmek için |
---|---|
DtdProcessing Özellik | DTD işlemeye izin verilip verilmeyeceği. Varsayılan değer, DTD işlemeye izin vermemektir. |
ValidationType Özellik | Okuyucunun verileri doğrulaması gerekip gerekmediği ve gerçekleştirilecek doğrulama türü (DTD veya şema). Varsayılan değer veri doğrulaması değildir. |
ValidationEventHandler Olay | 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 oluşturulur. |
ValidationFlags Özellik | Numaralandırma ü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. XmlSchemaValidationFlags Belirli senaryolarda kullanılacak ayarın 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:IDREF xs:key , , xs:keyref , xs:unique ) . (Varsayılan olarak etkindir.)- ProcessSchemaLocation --veya xsi:noNamespaceSchemaLocation özniteliği tarafından xsi:schemaLocation belirtilen şemaları işleme. (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 Özellik | 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. belirtmezseniz XmlResolver, XmlReader kullanıcı kimlik bilgileri olmadan varsayılan XmlUrlResolver değeri 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 öznitelik bildirimindeki ve
NmTokens
tekNotationType
birEnumeration
öznitelik bildirimindeki gösterimi 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 | İşlem | Varsayılan |
---|---|---|
CheckCharacters Özellik | 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.false Karakter varlığı başvuruları için karakter denetimini kapatmak için ayarıCheckCharacters. 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 destekleyecek ConformanceLevel.Fragmentşekilde yapılandırılmışsa ancak XML verileri bir belge türü tanımı (DTD) içeriyorsa, bir XmlException oluşturulur. |
ConformanceLevel Özellik | 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 |
Düğümler arasında gezinme
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 | İşlem |
---|---|
Read | İlk düğümü okuyun ve akışta bir kerede 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 NodeType türünü (örneğin, öznitelik, açıklama, öğe vb.) almak için ö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 , DocumentType, Comment, Whitespaceve SignificantWhitespacedüğümlerini içerirProcessingInstruction. İçerik düğümleri boşluk olmayan metin, CDATA, EntityReference ve EndEntityiçerir. |
ReadSubtree | Bir öğeyi ve tüm alt öğelerini okuyun ve olarak ayarlanmış ReadState.Initialyeni XmlReader bir örnek döndürin. 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 XmlReader.Read her seferinde bir düğüm arasında gezinme ve her düğümün türünü görüntüleme örneği için başvuru 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 .
Not
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.
Bu üyeyi XmlReader kullan | İşlem |
---|---|
IsStartElement Yöntem | Geçerli düğümün başlangıç etiketi mi yoksa boş öğe etiketi mi olduğunu denetleyin. |
ReadStartElement Yöntem | Geçerli düğümün bir öğe olup olmadığını denetleyin ve okuyucuyu sonraki düğüme (çağrılar IsStartElement ve Readardından ) ilerletin. |
ReadEndElement Yöntem | Geçerli düğümün bir bitiş etiketi olup olmadığını denetleyin ve okuyucuyu sonraki düğüme ilerletin. |
ReadElementString Yöntem | Salt metin öğesini okuyun. |
ReadToDescendant Yöntem | XML okuyucuyu belirtilen ada sahip bir sonraki alt öğeye ilerlet. |
ReadToNextSibling Yöntem | XML okuyucuyu belirtilen ada sahip bir sonraki eşdüzey öğeye ilerlet. |
IsEmptyElement Özellik | Geçerli öğenin bir bitiş öğesi etiketi olup olmadığını denetleyin. Örneğin: - <item num="123"/> (IsEmptyElement . true )- <item num="123"> </item> (IsEmptyElement öğesinin false içeriği boş olmasına rağmen olur.) |
Öğ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("<{0}/>", 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 , NamespaceURIgibi Namedüğü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.
Bu üyeyi XmlReader kullan | İşlem |
---|---|
HasAttributes Özellik | Geçerli düğümün öznitelikleri olup olmadığını denetleyin. |
AttributeCount Özellik | Geçerli öğedeki öznitelik sayısını alın. |
MoveToFirstAttribute Yöntem | Bir öğedeki ilk özniteliğe gitme. |
MoveToNextAttribute Yöntem | Bir öğede sonraki özniteliğe gitme. |
MoveToAttribute Yöntem | Belirtilen bir özniteliğe gitme. |
GetAttribute yöntem veya Item[] özellik | Belirtilen özniteliğin değerini alın. |
IsDefault Özellik | Geçerli düğümün DTD veya şemada tanımlanan varsayılan değerden oluşturulmuş bir öznitelik olup olmadığını denetleyin. |
MoveToElement Yöntem | 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öntem | Öznitelik değerini bir veya daha fazla Text , EntityReference veya 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, özniteliğine XmlReaderName konumlandırıldıktan sonra ve Value özellikleri ö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(" {0}", 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 while
yöntemini kullanırMoveToNextAttribute.
if (reader.HasAttributes) {
Console.WriteLine("Attributes of <" + reader.Name + ">");
while (reader.MoveToNextAttribute()) {
Console.WriteLine(" {0}={1}", 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. XmlReaderyöntemi, XmlTextReader sınıfı ve XmlValidatingReader sınıfı tarafından Create oluşturulan nesneler sürümü, tek başına ve öğeleri öznitelik olarak kodlamayı kullanıma sunar.
Belge türü düğümlerindeki öznitelikleri okuma
XML okuyucusu bir belge türü düğümünde konumlandırıldığında, GetAttribute system ve Item[] PUBLIC değişmez değerleri için değerleri döndürmek için yöntemi ve özelliği 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. veya MoveToAttribute yöntemiyle GetAttribute 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ür.)
Bu üyeyi XmlReader kullan | İşlem |
---|---|
Value Özellik | 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öntem | 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 | İşaretleme dahil ancak başlangıç ve bitiş etiketleri hariç olmak üzere geçerli düğümün tüm içeriğini alın. Örneğin, örneğin:<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, örneğin:<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 öğe 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 varlıklar genişletilir.
ReadContentAs yöntemleri metin içeriğini geçerli okuyucu konumunda okur ve XML verilerinde ilişkili şema veya veri türü bilgisi yoksa, metin içeriğini istenen dönüş türüne dönüştürün. 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ı, XmlReader W3C 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 | parametresiyle returnType belirttiğiniz tür |
ReadContentAsObject ve ReadElementContentAsObject | özelliği tarafından XmlReader.ValueType belirtilen en uygun tür. Eşleme 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, öğesini türüne dönüştürmek hire-date
için bir .xsd dosyası kullanır ve ardından öğesini nesne DateTime olarak döndürmek için yöntemini kullanırReadElementContentAsDateTime.xs:date
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: {0}", 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
Çıkış:
Six Month Review Date: 7/8/2003 12:00:00 AM
Zaman uyumsuz programlama
Yöntemlerin ç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:
- GetAttribute
- MoveToAttribute
- MoveToFirstAttribute
- MoveToNextAttribute
- MoveToElement
- ReadAttributeValue
- ReadSubtree
- ResolveEntity
Aşağıdaki bölümlerde, zaman uyumsuz karşılıkları olmayan yöntemler için zaman uyumsuz 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üvenlik konuları
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. DTD işleme yöntemi tarafından Create oluşturulan nesneler için XmlReader varsayılan olarak devre dışı bırakılır.
DTD işlemeyi etkinleştirdiyseniz, öğesini kullanarak XmlSecureResolver erişebileceği kaynakları XmlReader 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:
özelliğini bir XmlSecureResolver nesne olarak XmlReader ayarlayarak öğesinin XmlReaderSettings.XmlResolver erişebileceği kaynakları kısıtlayın.
özelliğini
null
olarak ayarlayarak öğesinin XmlReader dış kaynakları açmasına XmlReaderSettings.XmlResolver izin verme.
Bir XmlReaderSettings nesnenin ProcessInlineSchema ve ProcessSchemaLocation 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 nesnenin XmlReaderSettings nesnesi içindeki örnek belgesinde XmlReaderkarşılaşılan şema konumlarını çözümlemek için kullanılır. XmlResolver özelliği olarak
null
ayarlanırsa ve ProcessSchemaLocation doğrulama bayrakları ayarlansa ProcessInlineSchema 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 ProcessIdentityConstraints büyük bir bölümü üzerinde kimlik kısıtlamaları olan bir şemada güvenilmeyen büyük XML belgelerini doğrularken bayrağı 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:
özelliğini ayarlayarak belgenin boyutunu sınırlayın MaxCharactersInDocument .
özelliğini ayarlayarak varlıkların genişletilmesinden kaynaklanan karakter sayısını sınırlayın MaxCharactersFromEntities .
için XmlReaderözel
IStream
bir uygulama oluşturun.
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. öğesinden XmlReadertüretilen bir sınıf kullanıyorsanız ve her öğe için , Prefixveya NamespaceURI özelliğini çağırırsanızLocalName, döndürülen dize öğesine NameTableeklenir. tarafından tutulan koleksiyonun NameTable boyutu hiçbir zaman küçülerek dize tanıtıcılarının sanal bellek sızıntısını oluşturur. Bunun için bir risk azaltma, sınıfından türemek ve en büyük boyut kotasını NameTable zorlamaktır. (bir öğesinin kullanılmasını engellemenin NameTableveya dolduğunda değiştirmenin NameTable hiçbir yolu yoktur). Başka bir azaltma, belirtilen özellikleri kullanmaktan kaçınmak ve bunun yerine yöntemini mümkün olduğunca yöntemiyle IsStartElement kullanmaktırMoveToAttribute; bu yöntemler dize döndürmez ve bu nedenle koleksiyonun aşırı doldurulması NameTable sorununu önler.
XmlReaderSettings nesneleri, kullanıcı kimlik bilgileri gibi hassas bilgiler içerebilir. Güvenilmeyen bir bileşen, verileri okuyacak nesneler oluşturmak XmlReader için nesnesini ve kullanıcı kimlik bilgilerini kullanabilirXmlReaderSettings. Nesneleri önbelleğe alırken XmlReaderSettings veya nesneyi bir bileşenden diğerine geçirirken XmlReaderSettings dikkatli olun.
Güvenilmeyen bir kaynaktan , XmlNamespaceManagerve XmlResolver nesneleri gibi NameTabledestekleyici bileşenleri kabul etmeyin.