2011-07-26 8 views
3

XMLファイルがあり、DataSet.ReadXMLを使用してDataTableにロードしています。このXMLには内部DTDが定義されています。私はDataTable.ReadXMLがメモリにロードされる前にXMLを検証すると思った。それは事実ですか?DataSet.ReadXML()はDTDに対してXMLを検証します

私はそれが定義されたDTDに対してXMLを検証するために、私のデータセット内のいくつかのプロパティを設定する必要があるか、私はいくつかのパーソナルプラグイン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

あなたは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) 

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を検証するために、このコードを使用することができます:私は次のようにもXMLファイルのパスを使用することができます。ds.ReadXml( "C:\\ \\ TEMP_DTD.XMLをチェック"、XmlReadMode.ReadSchema); – Sverma

+0

@Sverma - なぜあなたはできないだろうか分からない。しかし、いくつか注意してください - まず、これはDataSetで動作しますが、DataTableには2番目のオプションでオーバーロードがないようです。 2つ目は、スキーマを作成するためにDTDを使用するのと同じくらいXMLを実際に検証することは完全にはわかりません。 – Tim

+0

私はxmlファイルのパスと共にXMLReadMode.ReadSchemaを使用すると、空の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を検証することです。

関連する問題