Asp.net DataSet.ReadXML()是否根据DTD验证XML
我有一个xml文件,正在使用DataSet.ReadXML将其加载到DataTable中。此XML定义了内部DTD。我认为DataTable.ReadXML会在将XML加载到内存之前对其进行验证。是这样吗 我需要在数据集中设置一些属性,使其根据定义的DTD验证Xml,还是需要使用其他Xml类验证它Asp.net DataSet.ReadXML()是否根据DTD验证XML,asp.net,xml,dataset,Asp.net,Xml,Dataset,我有一个xml文件,正在使用DataSet.ReadXML将其加载到DataTable中。此XML定义了内部DTD。我认为DataTable.ReadXML会在将XML加载到内存之前对其进行验证。是这样吗 我需要在数据集中设置一些属性,使其根据定义的DTD验证Xml,还是需要使用其他Xml类验证它 <?xml version="1.0" standalone="yes"?> <!DOCTYPE Resources [ <!ELEMENT Resources (Resou
<?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>dfjfhg@fkjg.com</ResourceEmail>
</Resource>
</Resources>
]>
测试
dfjfhg@fkjg.com
您需要在ReadXML方法中使用XmlReadMode枚举:
DataSet.ReadXml(Stream|String|TextReader|XmlReader, XmlReadMode.ReadSchema)
e、 g
编辑以添加
如果您希望验证XML,那么似乎需要使用XmlReader并创建一个“验证”读取器。请看这篇文章:
var errors=new StringBuilder();
var isValid=true;
var设置=新的XmlReaderSettings();
settings.ValidationEventHandler+=(o,e)=>{errors.AppendLine(e.Message);isValid=false;};
settings.ValidationType=ValidationType.DTD;
settings.DtdProcessing=DtdProcessing.Parse;
变量内容=@“
]>
测试
dfjfhg@fkjg.com
asdasd
";
使用(var validator=XmlReader.Create(新建StringReader(内容),设置))
{
while(validator.Read())
{
如果(!isValid)
{
validator.Close();
打破
}
}
}
解决方案是在加载到数据集中之前使用此代码验证xml。您可以使用此代码根据DTD验证xml
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);
:我是否可以使用xml文件的路径,如:ds.ReadXml(“C:\\check\\TEMP\u DTD.xml”,XmlReadMode.ReadSchema)@斯维玛-我不知道你为什么不能。不过要注意两件事——首先,这对DataSet有效,但DataTable似乎没有第二个选项的重载。第二,我不完全确定它是否会像使用DTD来创建模式那样验证XML。我只是尝试过,如果我使用XMLReadMode.ReadSchema和XML文件的路径,我最终得到的数据是空的。看起来DataTable是等效的,它将在ReadXml之前调用。仍然认为它不能进行验证。@Sverma-根据,ReadXmlSchema需要一个XSD,而不是一个带有内联DTD的XML文件。如果您的XML不是按照DTD定义的,那么第ds.ReadXml(validatingReader)行将给出一个错误
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>dfjfhg@fkjg.com</ResourceEmail>
<YourPlaceIsNotHere>asdasd</YourPlaceIsNotHere>
</Resource>
</Resources>";
using (var validator = XmlReader.Create(new StringReader(content), settings))
{
while (validator.Read())
{
if (!isValid)
{
validator.Close();
break;
}
}
}
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);