Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 birNmTokensöznitelik bildirimindekiEnumerationgö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 |
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 | İç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:
- GetAttribute
- MoveToAttribute
- MoveToFirstAttribute
- MoveToNextAttribute
- MoveToElement
- ReadAttributeValue
- ReadSubtree
- ResolveEntity
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:
XmlReader öğesinin erişebileceği kaynakları, XmlReaderSettings.XmlResolver özelliğini bir XmlSecureResolver nesnesi olarak ayarlayarak kısıtlayın.
XmlReader dış kaynakları açmasına izin vermemek için XmlReaderSettings.XmlResolver özelliğini
nullolarak ayarlayın.
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
nullolarak 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:
ö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 .
IStreamiçin özel bir XmlReader uygulaması 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. 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.