Проверка XML на соответствие XSD с использованием C #: данные на корневом уровне недействительны. Строка 1, позиция 1

Я пытаюсь проверить XML-файл на соответствие XSD-схеме и обнаружил исключение XmlException, сообщение

Данные на корневом уровне недействительны. Строка 1, позиция 1.

Основываясь на просмотре предыдущих похожих сообщений, я сделал следующее:

  1. Убедитесь, что в начале файлов нет пробелов.
  2. Подтвердил XML и схему на http://www.corefiling.com/opensource/schemaValidate.html
  3. Мои файлы закодированы без спецификации.
  4. Еще раз проверил отсутствие спецификации в шестнадцатеричном редакторе. Первые три символа XSD - это 3C 3F 78, а первые три символа XML - также 3C 3F 78.
  5. Проверил свой код, чтобы убедиться, что я загружаю XML, используя Load(), а не LoadXml()

Но ошибка сохраняется.

Моя функция загрузки XML гласит:

public void LoadXml(ref XmlDocument target, string path)
{
    try
    {                
        target = new XmlDocument();                
        target.Load(path);
    }
    catch (XmlException ex)            
    {
        // Exception is thrown is there is an error in the Xml
        MessageBox.Show(string.Format("An XML Exception was thrown while loading the XML file from {0}.\nException text: {1}\nXML file line: {2}", path, ex.Message, ex.LineNumber));
        Application.Exit();
    }
    catch (Exception ex)             
    {
        // General exception
        MessageBox.Show(string.Format("A General Exception was thrown while loading the XML file from {0}.\nException text: {1}", path, ex.Message));
        Application.Exit();
    }            
}

И моя функция проверки:

private bool ValidateXml(string xmlPath, string schemaPath)
{
    try
    {
        XmlReaderSettings xmlReaderSettings = new XmlReaderSettings();
        xmlReaderSettings.ValidationEventHandler += XmlReaderValidationEventHandler;

        xmlReaderSettings.CloseInput = true;
        xmlReaderSettings.ValidationType = ValidationType.Schema;
        xmlReaderSettings.Schemas.Add(null, Settings.Default.SchemaPath);
        xmlReaderSettings.ValidationFlags = XmlSchemaValidationFlags.ReportValidationWarnings |
                                                XmlSchemaValidationFlags.ProcessIdentityConstraints |
                                                XmlSchemaValidationFlags.ProcessInlineSchema |
                                                XmlSchemaValidationFlags.ProcessSchemaLocation;
        StringReader sr = new StringReader(Settings.Default.PlcXmlPath);
        using (XmlReader validatingReader = XmlReader.Create(sr, xmlReaderSettings))
        {                    
            while (validatingReader.Read())
            {
                // Loop through the document
            }
        }

        return true;
    }
    catch (XmlSchemaValidationException ex)
    {
        MessageBox.Show(string.Format("Unable to validate XML file {0} against schema {1}\nException text: {2}\nXML Line: {3}\nData: {4}", xmlPath, schemaPath, ex.Message, ex.LineNumber, ex.Data));
        return false;
    }
    catch (Exception ex)
    {
        MessageBox.Show(string.Format("Unable to validate XML file {0} against schema {1}\nException text: {2}", xmlPath, schemaPath, ex.Message));
        return false;
    }
}

Я сократил свои файлы XSD и XML практически до нуля, но эта ошибка осталась. Вот XSD:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="MachineParameters">

    </xsd:element>
</xsd:schema>

А вот и XML:

<?xml version="1.0" encoding="utf-8"?>
<MachineParameters>Test
</MachineParameters>

Может ли кто-нибудь заметить, что я сделал не так, или предложить какие-либо дальнейшие шаги? Я был бы очень признателен за вашу помощь - я бился об этом весь день.

ИЗМЕНИТЬ Ответы на вопросы и другая потенциально полезная информация:

Внутреннее исключение равно нулю. Трассировка стека: в System.Xml.XmlTextReaderImpl.Throw (исключение e) \ r \ n в System.Xml.XmlTextReaderImpl.Throw (String res, String arg) \ r \ n в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace () \ r \ n в System.Xml.XmlTextReaderImpl.ParseDocumentContent () \ r \ n в System.Xml.XmlTextReaderImpl.Read () \ r \ n в System.Xml.XsdValidatingReader.Read () \ r \ n в Configuration.PLCConfigurationTool. PlcConfigurationData.ValidateXml (String xmlPath, String schemaPath)

Изменить
Кажется, я решил эту проблему, заменив StringReader на StreamReader в функции проверки.

Я полагаю, StringReader просто читал бы путь к XML-файлу, а не фактически читал бы файл.


person technorabble    schedule 08.08.2013    source источник
comment
Есть ли у ошибки внутреннее исключение?   -  person Sayse    schedule 08.08.2013
comment
Внутреннее исключение равно нулю. Трассировка стека: StackTrace в System.Xml.XmlTextReaderImpl.Throw (Exception e) \ r \ n в System.Xml.XmlTextReaderImpl.Throw (String res, String arg) \ r \ n в System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace () \ r \ n в System.Xml.XmlTextReaderImpl.ParseDocumentContent () \ r \ n в System.Xml.XmlTextReaderImpl.Read () \ r \ n в System.Xml.XsdValidatingReader.Read () \ r \ n в Configuration.PLCConfigurationTool .PlcConfigurationData.ValidateXml (String xmlPath, String schemaPath) в ... и т. Д.   -  person technorabble    schedule 08.08.2013
comment
Пожалуйста, добавьте свой ответ. Мне просто повезло, что я заметил ваш комментарий / правку.   -  person Archlight    schedule 18.06.2014


Ответы (2)


Кажется, я решил эту проблему, заменив StringReader на StreamReader в функции проверки.

Я полагаю, StringReader просто читал бы путь к XML-файлу, а не фактически читал бы файл.

person technorabble    schedule 26.06.2014

Вы должны добавить атрибут targetNamespace в схему, а также добавить его в корневой узел MachineParameters в xml.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://myschema">
.
.
.

<?xml version="1.0" encoding="utf-8"?>
<MachineParameters xmlns="myschema">Test
</MachineParameters>
person moomi    schedule 08.08.2013
comment
Кажется, я решил эту проблему, заменив StringReader на StreamReader в функции проверки. - person technorabble; 08.08.2013