Валидиране на XML спрямо XSD с помощта на C#: Данните на основно ниво са невалидни. Ред 1, позиция 1

Опитвам се да валидирам XML файл спрямо XSD схема и срещам XmlException, съобщение

Данните на основно ниво са невалидни. Ред 1, позиция 1.

Въз основа на обхождане на предишни подобни публикации направих следното:

  1. Гарантира се, че няма празно пространство в началото на файловете.
  2. Валидирани XML и схема на http://www.corefiling.com/opensource/schemaValidate.html
  3. Уверих се, че файловете ми са кодирани без BOM.
  4. Двойна проверка за липсата на BOM в шестнадесетичен редактор. Първите три знака на 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(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)

Редактиране
Изглежда, че съм коригирал този проблем, като замених 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