Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net DataSet.ReadXML()是否根据DTD验证XML_Asp.net_Xml_Dataset - Fatal编程技术网

Asp.net DataSet.ReadXML()是否根据DTD验证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文件,正在使用DataSet.ReadXML将其加载到DataTable中。此XML定义了内部DTD。我认为DataTable.ReadXML会在将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>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);