Как использовать xmlschemaset и xmlreader.create для проверки xml по схеме xsd - PullRequest
3 голосов
/ 02 июня 2011

Я исправляю предупреждения в своей программе, и, очевидно, xmlvalidating reader и xmlschemacollection устарели. Проблема в том, что я не совсем уверен, как. Вот попытка «подражать» предыдущей проверочной функции с новой, включающей xmlschemaset и xmlreader.create. Сначала я объявляю схему и устанавливаю ее с помощью строки targeturi, затем добавляю ее в набор схем при настройке обработчика события проверки. Я думаю, что моя проблема заключается в настройке читателей и входных потоков. Я знал, как это сделать с помощью xmlvalidating reader, но это не вариант, если я хочу исправить эти предупреждения. Вот код и попытка. Во время тестирования использовался только новый проверочный код xml, старый был закомментирован.

            // New Validation Xml.
            string xsd_file = filename.Substring(0, filename.Length - 3) + "xsd";
            XmlSchema xsd = new XmlSchema();
            xsd.SourceUri = xsd_file;

            XmlSchemaSet ss = new XmlSchemaSet();
            ss.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            ss.Add(xsd);
            if (ss.Count > 0)
            {
                XmlTextReader r = new XmlTextReader(filename2);
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas.Add(ss);
                settings.ValidationEventHandler +=new ValidationEventHandler(ValidationCallBack);
                XmlReader reader = XmlReader.Create(filename2, settings);
                while (reader.Read())
                {
                }
                reader.Close();
            }

            // Old Validate XML
            XmlSchemaCollection sc = new XmlSchemaCollection();
            sc.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            sc.Add(null, xsd_file);
            if (sc.Count > 0)
            {
                XmlTextReader r = new XmlTextReader(filename2);
                XmlValidatingReader v = new XmlValidatingReader(r);
                v.ValidationType = ValidationType.Schema;
                v.Schemas.Add(sc);
                v.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
                while (v.Read())
                {
                }
                v.Close();
            }

    private void ValidationCallBack(object sender, ValidationEventArgs e)
    {
        // If Document Validation Fails
        isvalid = false;
        MessageConsole.Text = "INVALID. Check message and datagridview table.";
        richTextBox1.Text = "The document is invalid: " + e.Message;
    }

К сожалению, когда я запускаю программу и пытаюсь проверить недопустимый XML-документ, он выдает мне такую ​​ошибку: «Элемент« URNLookup »не объявлен». Элемент URNLookup является корневым элементом файла xml. Я всегда могу вернуться к старому методу проверки, но эти предупреждения меня пугают.

Любая помощь очень ценится. Заранее спасибо! Я буду рад предоставить дополнительную информацию, если я что-то пропустил.

  • tf.rz (.NET 3.5 SP1, Visual Studio C # 2008)

1 Ответ

7 голосов
/ 03 июня 2011

Я исправил проблему, и теперь она снова работает без предупреждений. В новом валидационном XML:

            // New Validation Xml.
            string xsd_file = filename.Substring(0, filename.Length - 3) + "xsd";
            XmlSchema xsd = new XmlSchema();
            xsd.SourceUri = xsd_file;

            XmlSchemaSet ss = new XmlSchemaSet();
            ss.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
            ss.Add(null, xsd_file);
            if (ss.Count > 0)
            {
                XmlReaderSettings settings = new XmlReaderSettings();
                settings.ValidationType = ValidationType.Schema;
                settings.Schemas.Add(ss);
                settings.Schemas.Compile();
                settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
                XmlTextReader r = new XmlTextReader(filename2);
                using (XmlReader reader = XmlReader.Create(r, settings))
                {
                    while (reader.Read())
                    {
                    }
                }
            }

ss.add был изменен, чтобы иметь пространство имен и строку файла. settings.schemas.compile () был добавлен, и была добавлена ​​незначительная реорганизация "using (xmlreader reader ... ....").

Эта страница мне очень помогла: http://msdn.microsoft.com/en-us/library/fe6y1sfe(v=vs.80).aspx Теперь она работает.

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