Как проверить файл, чтобы проверить, действительно ли он является файлом XML, прежде чем загружать его с помощью XDocument.Load()?
Я загружаю XML-документ в свое приложение С# со следующим:
XDocument xd1 = new XDocument();
xd1 = XDocument.Load(myfile);
но до этого я тестирую, чтобы убедиться, что файл существует:
File.Exists(myfile);
Но... есть ли (простой) способ проверить файл перед XDocument.Load(), чтобы убедиться, что он действительный XML файл? Другими словами, мой пользователь может случайно щелкнуть по другому файлу в браузере файлов и попытаться загрузить, скажем, файл .php вызывает исключение.
Единственный способ, который я могу представить, - загрузить его в StreamWriter и просто выполнить текстовый поиск по первым нескольким символам, чтобы убедиться, что они говорят:
Спасибо!
-Adeena
Ответы
Ответ 1
Вероятно, стоит просто поймать конкретное исключение, если вы хотите показать сообщение пользователю:
try
{
XDocument xd1 = new XDocument();
xd1 = XDocument.Load(myfile);
}
catch (XmlException exception)
{
ShowMessage("Your XML was probably bad...");
}
Ответ 2
Этот вопрос смущает " well-formed" с " valid" XML-документ.
Действительный XML-документ по определению является хорошо сформированным документом. Дополнительно, он должен удовлетворять DTD или схеме (a XML-схема, схема relaxng, schematron или другие ограничения).
Судя по формулировке вопроса, скорее всего, он спрашивает:
"Как убедиться, что файл содержит хорошо сформированный документ XML?".
Ответ заключается в том, что XML-документ хорошо сформирован, если его можно успешно проанализировать с помощью совместимого анализатора XML. Поскольку метод XDocument.Load() делает именно это, вам нужно только поймать исключение, а затем сделать вывод, что текст, содержащийся в файле, не очень хорошо сформирован.
Ответ 3
Просто загрузите его и поймайте исключение. То же самое для File.Exists()
- файловая система изменчива, поэтому только потому, что File.Exists()
возвращает true, не означает, что вы сможете ее открыть.
Ответ 4
Если у вас есть XSD для XML, попробуйте следующее:
using System;
using System.Xml;
using System.Xml.Schema;
using System.IO;
public class ValidXSD
{
public static void Main()
{
// Set the validation settings.
XmlReaderSettings settings = new XmlReaderSettings();
settings.ValidationType = ValidationType.Schema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ProcessInlineSchema;
settings.ValidationFlags |= XmlSchemaValidationFlags.ReportValidationWarnings;
settings.ValidationEventHandler += new ValidationEventHandler(ValidationCallBack);
// Create the XmlReader object.
XmlReader reader = XmlReader.Create("inlineSchema.xml", settings);
// Parse the file.
while (reader.Read());
}
// Display any warnings or errors.
private static void ValidationCallBack (object sender, ValidationEventArgs args)
{
if (args.Severity == XmlSeverityType.Warning)
Console.WriteLine("\tWarning: Matching schema not found. No validation occurred." + args.Message);
else
Console.WriteLine("\tValidation error: " + args.Message);
}
}
Ссылка здесь:
http://msdn.microsoft.com/en-us/library/system.xml.xmlreadersettings.validationeventhandler.aspx
Ответ 5
Как уже упоминалось, "valid xml" проверяется с помощью XmlDocument.Load(). Просто поймайте исключение. Если вам нужна дополнительная проверка, чтобы проверить, что она действительна для схемы, то это делает то, что вы после:
using System.Xml;
using System.Xml.Schema;
using System.IO;
static class Program
{
private static bool _Valid = true; //Until we find otherwise
private static void Invalidated()
{
_Valid = false;
}
private static bool Validated(XmlTextReader Xml, XmlTextReader Xsd)
{
var MySchema = XmlSchema.Read(Xsd, new ValidationEventHandler(Invalidated));
var MySettings = new XmlReaderSettings();
{
MySettings.IgnoreComments = true;
MySettings.IgnoreProcessingInstructions = true;
MySettings.IgnoreWhitespace = true;
}
var MyXml = XmlReader.Create(Xml, MySettings);
while (MyXml.Read) {
//Parsing...
}
return _Valid;
}
public static void Main()
{
var XsdPath = "C:\\Path\\To\\MySchemaDocument.xsd";
var XmlPath = "C:\\Path\\To\\MyXmlDocument.xml";
var XsdDoc = new XmlTextReader(XsdPath);
var XmlDoc = new XmlTextReader(XmlPath);
var WellFormed = true;
XmlDocument xDoc = new XmlDocument();
try {
xDoc.Load(XmlDoc);
}
catch (XmlException Ex) {
WellFormed = false;
}
if (WellFormed & Validated(XmlDoc, XsdDoc)) {
//Do stuff with my well formed and validated XmlDocument instance...
}
}
}
Ответ 6
Я бы не XDocument.Load(), в соответствии с принятым ответом; почему бы вам прочитать весь файл в памяти, это может быть огромный файл?
Я бы, наверное, прочитал первые несколько байтов в byteArray (это мог бы быть любой двоичный файл), преобразовать byteArray в строку
например System.Text.Encoding.ASCII.GetString(byteArray)
, проверьте, что преобразованная строка содержит элементы Xml, которые вы ожидаете, только затем продолжайте.