2009-11-01 24 views
5

Ben sadece emin bir belge geçerli olup olmadığını ve eğer değilse bir hata mesajı yazdırmak istediğiniz, fantezi bir şey yapmak istemiyoruz. (En azından bu MonoDevelop bunu söyledi) Google'ın this beni işaret etti, ancak XmlValidatingReader kullanılmıyor gibi görünüyor.C# içinde bir XML belgesini DTD'ye karşı nasıl doğrularım?

Düzenleme: Mehrdad en uç çalışıyorum ama sorun yaşıyorum. Sanırım çoğunu aldım, ancak OnValidationEvent öğesini her yerde bulamıyorum. Nereye OnValidationEvent alıyorum?

XmlReaderSettings settings = new XmlReaderSettings(); 
settings.ValidationType = ValidationType.DTD; 
settings.ValidationEventHandler += new ValidationEventHandler(/*trouble is here*/); 
XmlReader validatingReader = XmlReader.Create(fileToLoad, settings); 
+0

Bu arada, "C# ye dönüştürme" ile ne demek istiyorsunuz. Kodum * C# 3.0'da *. –

+0

@Mehrdad: Üzgünüm, hala C# 1.0 öğrenirken ve 'var' C# 'da geçerli olduğunu bilmiyordum. –

cevap

4

yerine, doğrudan XmlValidatingReader class oluşturmak yerine, uygun bir XmlReaderSettings object oluşturmalıdır ve XmlReader.Create method için bir bağımsız değişken olarak geçmek:

var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); 
var reader = XmlReader.Create("file.xml", settings); 

kalan değişmez.

P.S. OnValidationEvent, doğrulama olaylarını ele almayı bildirdiğiniz yöntemin adıdır. Eğer XmlReader tarafından gündeme doğrulama olaylara abone olmak istemiyorsanız Açıkçası, çizgi kaldırabilirsiniz.

+0

OnValidationEvent nereden geliyor? Düzenlememe bak. –

+0

Matthew: Başarısız doğrulama olaylarını işlemek için bildireceğiniz yöntem budur. Bunun yerine istisna atmak isterseniz o satırı tamamen kaldırabilirsiniz. –

2
var messages = new StringBuilder(); 
var settings = new XmlReaderSettings { ValidationType = ValidationType.DTD }; 
settings.ValidationEventHandler += (sender, args) => messages.AppendLine(args.Message); 
var reader = XmlReader.Create("file.xml", settings); 

if (messages.Length > 0) 
{ 
    // Log Validation Errors 
    // Throw Exception 
    // Etc. 
} 

ValidationEventHandler

Lambda Expressions

Type Inference

+0

Um, Mehrdad ondan 22 dakika önce esasen aynı cevabı vermedi mi? –

+0

Bu cevap, aynı şeyi gerçekleştirmenin farklı bir yoludur. – ChaosPandion

-1

tam tanımı: Visual Studio .NET

  1. , yeni bir Visual C# konsol uygulaması projesi oluşturmak adında ValidateXml. şöyle Class1.cs başlangıcına iki kullanarak ifadeleri ekleyin: aşağıdaki gibi Class1.cs yılında

    using System.Xml;  // for XmlTextReader and XmlValidatingReader 
    using System.Xml.Schema; // for XmlSchemaCollection (which is used later) 
    
  2. , Main yöntemin başlamadan önce isValid adında bir boolean değişkeni bildirin:

    private static bool isValid = true;  // If a validation error occurs, 
                 // set this flag to false in the 
                 // validation event handler. 
    
  3. Main yönteminde bir metin dosyadan bir XML belgesi okumak için XmlTextReader nesne oluşturun ve sonra bir XmlValidatingReaderoluşturmak doğrulamak Bu XML veri aşağıdaki gibidir:

    XmlTextReader r = new XmlTextReader("C:\\MyFolder\\ProductWithDTD.xml"); 
    XmlValidatingReader v = new XmlValidatingReader(r); 
    
  4. XmlValidatingReader nesnenin arasında ValidationType özelliği (DTD, XDR veya Şeması) doğrulama türünü gösterir. DTD aşağıdaki gibi, bu özelliği ayarlamak: herhangi bir doğrulama hata oluşursa

    v.ValidationType = ValidationType.DTD; 
    
  5. , doğrulama okuyucu doğrulama olayı oluşturur.Bir doğrulama olay işleyicisi kaydetmek için aşağıdaki kodu ekleyin (Adım 7'de MyValidationEventHandler yöntemi uygulayacak):

    v.ValidationEventHandler += 
        new ValidationEventHandler(MyValidationEventHandler); 
    
  6. okuyup XML belgesini doğrulamak için aşağıdaki kodu ekleyin. Herhangi bir doğrulama hatası oluşursa, hata adrese MyValidationEventHandler çağrılır. Bu yöntem isValid değerini false olarak ayarlar (bkz. Adım 8). belgesinin geçerli veya geçersiz olup olmadığını görmek için doğrulamadan sonra isValid durumunu kontrol edebilirsiniz.

    public static void MyValidationEventHandler(object sender, 
                  ValidationEventArgs args) 
    { 
        isValid = false; 
        Console.WriteLine("Validation event\n" + args.Message); 
    } 
    

Oluştur ve uygulamayı çalıştırın: olarak Main yöntem aşağıdaki sonra

while (v.Read()) 
{ 
    // Can add code here to process the content. 
} 
v.Close(); 

// Check whether the document is valid or invalid. 
if (isValid) 
    Console.WriteLine("Document is valid"); 
else 
    Console.WriteLine("Document is invalid"); 
  • MyValidationEventHandler yöntem yazın. Uygulama, XML belgesinin geçerli olduğunu bildirmelidir. Visual Studio. NET'te, geçersiz kılmak için ProductWithDTD.xml'u değiştirin (örneğin, <AuthorName>M soliman</AuthorName> öğesinin silinmesi). Uygulamayı tekrar çalıştırın. Aşağıdaki hata iletisini almalısınız:
    Validation event 
    Element 'Product' has invalid content. Expected 'ProductName'. 
    An error occurred at file:///C:/MyFolder/ProductWithDTD.xml(4, 5). 
    Document is invalid 
    
  • +1

    Meh - bu, neredeyse birebir örneklemin neredeyse bir kopyası/yapıştırmasıdır. En azından, bir referans verin: http://support.microsoft.com/kb/307379 –

    İlgili konular