Я пытаюсь проверить XML-файл на соответствие XSD-схеме и обнаружил исключение XmlException, сообщение
Данные на корневом уровне недействительны. Строка 1, позиция 1.
Основываясь на просмотре предыдущих похожих сообщений, я сделал следующее:
- Убедитесь, что в начале файлов нет пробелов.
- Подтвердил XML и схему на http://www.corefiling.com/opensource/schemaValidate.html а>
- Мои файлы закодированы без спецификации.
- Еще раз проверил отсутствие спецификации в шестнадцатеричном редакторе. Первые три символа 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 (исключение 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-файлу, а не фактически читал бы файл.