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ı?
Öneriniz için teşekkür ederiz; System.Xml.XmlResolver' alt sınıfını kullanarak tamir edip edemeyeceğimi denemeyi deneyeceğim. – ChrisW
Ş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
@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