2009-01-22 47 views
8

我有沒有DOCTYPE聲明,我想用在閱讀一個外部DTD驗證XML文件。.NET:如何驗證與DTD XML文件,而不DOCTYPE聲明

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) 

你如何設置外部DTD的路徑?你如何驗證?

+0

返回FALSE; ;) – 2009-01-22 18:50:25

回答

1

你能創造你想要的DTD的Xml.XmlDocument,然後將XML文件數據追加到內存Xml.XmlDocument,然後驗證?

15

我用下面的函數成功之前,它應該很容易適應。這怎麼依賴創建一個XmlDocument作爲提及的magnifico。這可以通過以下方式實現:

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

如果可以的話,我會投票20次。我已經接近SOOO了,但是這樣做了。謝謝! – CindyH 2011-11-09 22:17:07

+0

真的很有用的答案。對於那些誰閱讀,最新的.NET framework版本,喜歡settings.DtdProcessing = DtdProcessing.Parse代替settings.ProhibidDtd =假。 – artragis 2014-07-15 08:43:50

-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); 
}