2010-08-10 13 views
10

Rasgele bir XML dosyasının belirli bir şema ile eşleşip eşleşmediğini test etmek (doğru veya yanlış) kullanmak istiyorum.XML'i bir şemaya göre doğrulamak için .NET'i kullanma

Değeri için şema, Microsoft'un 7 *.xsd dosyalarının bir listesini kullanarak tanımladığı Word 2003 WordML şemasıdır. Bu dosyaların

biri de aşağıdaki ifadeyi dahil ederek, W3C xml.xsd dosyası içerir:

<xsd:import id="xml" namespace="http://www.w3.org/XML/1998/namespace" 
    schemaLocation="http://www.w3.org/2001/xml.xsd"></xsd:import> 

ben gibi .NET kod kullanıyorum doğrulama yapmak için aşağıdaki:

public static void validate(string filename) 
    { 
     XmlReaderSettings settings = new XmlReaderSettings(); 
     settings.Schemas.Add(
      "http://schemas.microsoft.com/office/word/2003/wordml", 
      //to get this file I downloaded "Office 2003: XML Reference Schemas", i.e. "Office2003XMLSchema.exe" 
      @"C:\Program Files\Microsoft Office 2003 Developer Resources\Microsoft Office 2003 XML Reference Schemas\WordprocessingML Schemas\wordnet.xsd" 
      ); 
     settings.ValidationType = ValidationType.Schema; 
     settings.ValidationEventHandler += new ValidationEventHandler(validationEventHandler); 
     XmlReader xmlReader = XmlReader.Create(filename, settings); 
     while (xmlReader.Read()) { } 
    } 

Benim Sorun şu ki, bu kodu internete bağlı olmayan bir makinede çalıştırırsam, XmlSchemaValidationException hatasını xml.xsd bulamadığı bir hatayı alıyorum.

Bunu düzeltmek için, xml.xsd dosyasının bir kopyasını indirdim ve settings.Schemas.Add yöntemini kullanarak bunu açıkça ekledim: doğrulama, makine internete bağlı olmadığında artık düzgün çalışıyor.

Ancak, makine internete bağlandığında, şimdi The global attribute 'http://www.w3.org/XML/1998/namespace:lang' has already been declared. olduğunu belirten bir hata alıyorum.

Görünüşe göre, ya makineyi sessizce internetten indirip yükleyemediğine bağlı olarak (veya belki de daha önce bu dosyayı indirip yükleyemediğine bağlı olarak) ya da açıkça eklemem gerekiyor. yere).

Yani, "Yapmazsam ve lanet yaparsam lanetlenir". Bunu bir yolla denemem, istisnaları yakalayıp başka bir şekilde denemem gerekiyor mu? Yoksa daha zarif bir çözüm var mı?

cevap

4

Kodunuzu göremiyoruz, ancak Birçok uygulamada bu, .xsd isteğini bir katalog çözümleyici kullanarak yerel kopyaya yeniden yönlendirerek işlenir. Bunun için kullanılabilecek XmlReaderSettings.XmlResolver bir özellik var. Kullanabileceğiniz bir Apache lisanslı uygulama için bkz. XMLCatalog.net.

Bunun bir yan etkisi, tüm şemaların yerel olarak önbelleğe alınabilmesidir. Bu özellikle önemlidir çünkü W3C sitelerine aşırı okumaları engelleyecektir ve rastgele kodunuz (veya daha kötüsü, müşterinizin kodu) başarısız olmaya başlayacaktır.

+0

Öneriniz için teşekkür ederiz; System.Xml.XmlResolver' alt sınıfını kullanarak tamir edip edemeyeceğimi denemeyi deneyeceğim. – ChrisW

+1

Şimdi çalışıyorum. Daha önce başarısız oldum çünkü 'XmlReaderSettings.XmlResolver' özelliğine atandım; ancak "settings.Schemas.Add" kullanıyorum, bu yüzden "settings.Schemas.XmlResolver" özelliğine atamak istedim. – ChrisW

+1

@ChrisW: Ayrıca, orijinal sorunda olduğu gibi, "Genel öznitelik 'http://www.w3.org/XML/1998/namespace:lang' zaten bildirilmiştir." Hatasını alıyorum. Settings.Schemas.XmlResolver öğesini XMLCatalogResolver veya başka bir şeye ayarladınız mı? Bunu şanssız denedim. Çalışma kodunuzu yapıştırma şansınız var mı? – Jeremy

İlgili konular