2011-07-26 373 views
3

我有一個xml文件,並使用DataSet.ReadXML將它加載到DataTable中。該XML具有內部DTD定義。我認爲DataTable.ReadXML在加載到內存之前驗證XML。是這樣嗎?DataSet.ReadXML()根據DTD驗證XML

我需要設置我的數據集內的一些屬性,以使驗證XML對定義的DTD或者我是否需要使用一些行吟詩人XML類

<?xml version="1.0" standalone="yes"?> 

<!DOCTYPE Resources [ 
<!ELEMENT Resources (Resource)+> 
<!ELEMENT Resource (ResourceName,ResourceEmail)> 
<!ELEMENT ResourceName (#PCDATA)> 
<!ELEMENT ResourceEmail (#PCDATA)> 

]> 

<Resources> 
<Resource> 
<ResourceName>test</ResourceName> 
<ResourceEmail>[email protected]</ResourceEmail> 
</Resource> 
</Resources> 

回答

0

您可以使用此代碼來驗證你的XML針對DTD

XmlReaderSettings settings = new XmlReaderSettings(); 
       settings.DtdProcessing = DtdProcessing.Parse; 
       settings.ValidationType = ValidationType.DTD; 

       string data = null; 
       XmlReader validatingReader = XmlReader.Create(File.Open("C:\\check\\TEMP_DTD.XML", FileMode.Open), settings, data); 

       DataSet ds = new DataSet(); 
       ds.ReadXml(validatingReader); 
+0

如果你的XML沒有按照DTD定義,那麼行ds.ReadXml(validatingReader)會給出錯誤 –

+0

這個工作,謝謝 – Sverma

0

來驗證它,你需要使用XmlReadMode枚舉與ReadXML方法:

DataSet.ReadXml(Stream|String|TextReader|XmlReader, XmlReadMode.ReadSchema) 

eg

string xml = // your xml here; can also use Stream, TextReader or XmlReader 

DataSet.ReadXml(xml, XmlReadMode.ReadSchema); 

DataSet.ReadXml Method

XmlReadMode Enumeration

編輯補充

如果你正在尋找驗證的XML,看來你需要使用的XmlReader,並創建一個「驗證「讀者。看看這篇文章:

DataSet does not validate XML Schema (XSD)

+0

:我可以使用XML文件的路徑,以及像:ds.ReadXml(「C:\\ \\檢查TEMP_DTD.XML 「,XmlReadMode.ReadSchema); – Sverma

+0

@Sverma - 我不知道你爲什麼不能。請注意一些事情 - 首先,這適用於DataSet,但DataTable似乎沒有第二個選項的重載。其二,我不完全確定它會像使用DTD創建模式一樣驗證XML。 – Tim

+0

我剛剛嘗試過,如果我使用XMLReadMode.ReadSchema以及我的xml文件的路徑,我最終得到空DataSet – Sverma

0
 var errors = new StringBuilder(); 
     var isValid = true; 
     var settings = new XmlReaderSettings(); 
     settings.ValidationEventHandler += (o, e) => { errors.AppendLine(e.Message); isValid = false; }; 
     settings.ValidationType = ValidationType.DTD; 
     settings.DtdProcessing = DtdProcessing.Parse; 


     var content = @"<?xml version=""1.0"" standalone=""yes""?> 
          <!DOCTYPE Resources [ 
          <!ELEMENT Resources (Resource)+> 
          <!ELEMENT Resource (ResourceName,ResourceEmail)> 
          <!ELEMENT ResourceName (#PCDATA)> 
          <!ELEMENT ResourceEmail (#PCDATA)>        
          ]>       
         <Resources> 
          <Resource> 
           <ResourceName>test</ResourceName> 
           <ResourceEmail>[email protected]</ResourceEmail> 

           <YourPlaceIsNotHere>asdasd</YourPlaceIsNotHere> 


          </Resource> 
         </Resources>"; 
     using (var validator = XmlReader.Create(new StringReader(content), settings)) 
     { 
      while (validator.Read()) 
      { 
       if (!isValid) 
       { 
        validator.Close(); 
        break; 
       } 
      } 
     } 

一種解決方案是加載到DataSet中,使用此代碼之前驗證XML。