2011-07-26 212 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。