2009-01-22 13 views
8

Okunduğum bir dış DTD ile doğrulamak istediğiniz bir DOCTYPE bildirimi olmayan bir XML dosyası var..NET: DOCTYPE bildirimi olmadan DTD ile XML dosyasını doğrulamak için nasıl

Dim x_set As Xml.XmlReaderSettings = New Xml.XmlReaderSettings() 
x_set.XmlResolver = Nothing 
x_set.CheckCharacters = False 
x_set.ProhibitDtd = False 
x = XmlTextReader.Create(sChemin, x_set) 

Bu harici DTD'nin yolunu nasıl belirlersiniz? Nasıl doğrularsınız?

+0

dönüş sahte; ;) –

cevap

1

İstediğiniz DTD ile bir Xml.XmlDocument oluşturabilir, daha sonra XML dosya verilerini bellek içi Xml.XmlDocument dosyasına ekleyebilir, ardından bunu doğrulayabilirsiniz?

15

Daha önce aşağıdaki işlevi başarılı bir şekilde kullandım. Bu, bundan önce magnifico adı verilen bir XmlDocument oluşturmaya dayanır. Bu elde edilebilir:

XmlDocument doc = new XmlDocument(); 
doc.Load(filename); 
doc.InsertBefore(doc.CreateDocumentType("doc_type_name", null, DtdFilePath, null), 
    doc.DocumentElement); 


/// <summary> 
/// Class to test a document against DTD 
/// </summary> 
/// <param name="doc">XML The document to validate</param> 
private static bool ValidateDoc(XmlDocument doc) 
{ 
    bool isXmlValid = true; 
    StringBuilder xmlValMsg = new StringBuilder(); 

    StringWriter sw = new StringWriter(); 
    doc.Save(sw); 
    doc.Save(TestFilename); 

    XmlReaderSettings settings = new XmlReaderSettings(); 
    settings.ProhibitDtd = false; 
    settings.ValidationType = ValidationType.DTD; 
    settings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings; 
    settings.ValidationEventHandler += new ValidationEventHandler(delegate(object sender, ValidationEventArgs args) 
    { 
     isXmlValid = false; 
     xmlValMsg.AppendLine(args.Message); 
    }); 

    XmlReader validator = XmlReader.Create(new StringReader(sw.ToString()), settings); 

    while(validator.Read()) 
    { 
    } 
    validator.Close(); 

    string message = xmlValMsg.ToString(); 
    return isXmlValid; 
} 
+0

Bunu yapabilseydim 20 kez oy kullanırdım. SOOO'yu kapattım ama bu yaptı. Teşekkürler! – CindyH

+0

Gerçekten yararlı bir cevap. Bunu okuyanlar için, .NET framework'ün en yeni sürümü settings.DtdProcessing = settings.ProhibidDtd = false yerine DtdProcessing.Parse tercih ediyor. – artragis

+0

Yani, çözüm hala DOCTYPE dizgisini en başa eklememiz gerekecek mi? Kodun DOCTYPE dizesinde belirtilmeyen bir dış noktaya işaret etmesinin bir yolu var mı? –

-1
private static bool _isValid = true; 
static void Main(string[] args) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     using (FileStream file = new FileStream("C:\\MyFolder\\Product.dtd", FileMode.Open, FileAccess.Read)) 
     { 
      byte[] bytes = new byte[file.Length]; 
      file.Read(bytes, 0, (int) file.Length); 
      ms.Write(bytes, 0, (int) file.Length); 
     } 
     using (FileStream file = new FileStream("C:\\MyFolder\\Product.xml", FileMode.Open, FileAccess.Read)) 
     { 
      byte[] bytes = new byte[file.Length]; 
      file.Read(bytes, 0, (int) file.Length); 
      ms.Write(bytes, 0, (int) file.Length); 
     } 
     ms.Position = 0; 

     var settings = new XmlReaderSettings(); 
     settings.DtdProcessing = DtdProcessing.Parse; 
     settings.ValidationType = ValidationType.DTD; 
     settings.ValidationEventHandler += new ValidationEventHandler(OnValidationEvent); 
     var reader = XmlReader.Create(ms, settings); 

     // Parse the file. 
     while (reader.Read()) ; 
    } 
    // Check whether the document is valid or invalid. 
    if (_isValid) 
     Console.WriteLine("Document is valid"); 
    else 
     Console.WriteLine("Document is invalid"); 
} 

private static void OnValidationEvent(object obj, ValidationEventArgs args) 
{ 
    _isValid = false; 
    Console.WriteLine("Validation event\n" + args.Message); 
} 
+2

Yanıtınız, kodunuzun açıklamasını ve sorunun nasıl çözüldüğünü açıklayan bir açıklama içermelidir. – AbcAeffchen

+0

Harici bir DTD belgesine karşı xml'nin doğrulanması için bir yol bulamadım. Benim durumumda, bir tcp/ip yuvasından XML alıyorum ve bunu bir DTD dosyasına karşı doğrulamak istiyorum. Yukarıdaki örnek, DTD doğrulamasını yapmak için XmlReader nesnesini kullanmadan önce bir DTD'yi ve bazı XML'yi aynı akışta birlikte nasıl birleştirebileceğinizi gösterir. – Matt

İlgili konular