Опитвам се да валидирам XML файл спрямо XSD схема и срещам XmlException, съобщение
Данните на основно ниво са невалидни. Ред 1, позиция 1.
Въз основа на обхождане на предишни подобни публикации направих следното:
- Гарантира се, че няма празно пространство в началото на файловете.
- Валидирани XML и схема на http://www.corefiling.com/opensource/schemaValidate.html
- Уверих се, че файловете ми са кодирани без BOM.
- Двойна проверка за липсата на BOM в шестнадесетичен редактор. Първите три знака на XSD са 3C 3F 78, а първите три знака на XML също са 3C 3F 78.
- Проверих кода си, за да се уверя, че зареждам 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 файла, вместо всъщност да чете файла.