Проверяет ли DataSet.ReadXML () XML на соответствие DTD? - PullRequest
3 голосов
/ 26 июля 2011

У меня есть XML-файл, и я загружаю его в DataTable, используя DataSet.ReadXML.Этот XML имеет определенное внутреннее DTD.Я думал, DataTable.ReadXML Проверяет 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>dfjfhg@fkjg.com</ResourceEmail>
</Resource>
</Resources>

Ответы [ 3 ]

0 голосов
/ 26 июля 2011
        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;
                }
            }
        }

Решение заключается в проверке xml перед загрузкой в ​​набор данных с использованием этого кода.

0 голосов
/ 26 июля 2011

Вы можете использовать этот код для проверки вашего 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 голосов
/ 26 июля 2011

Необходимо использовать перечисление 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

Перечисление XmlReadMode

ИЗМЕНЕНО В ДОБАВИТЬ

Если вы хотите проверить XML, кажется, вам нужноиспользуйте XmlReader и создайте «проверяющий» читатель.Взгляните на этот пост:

DataSet не проверяет XML-схему (XSD)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...