我正在使用以下内容在C#应用程序中加载XML文档:
XDocument xd1 = new XDocument();
xd1 = XDocument.Load(myfile);
但在此之前,我会测试以确保该文件存在:
File.Exists(myfile);
但是......有一种(简单的)方法在XDocument.Load()之前测试文件以确保它是一个有效的XML文件吗?换句话说,我的用户可能会意外地点击文件浏览器中的其他文件并尝试加载,例如,.php文件会导致异常。
我能想到的唯一方法是将它加载到StreamWriter中并简单地对前几个字符进行文本搜索,以确保它们说“
谢谢!
-Adeena
答案 0 :(得分:43)
如果您想向用户显示消息,可能只需要捕获特定的异常:
try
{
XDocument xd1 = new XDocument();
xd1 = XDocument.Load(myfile);
}
catch (XmlException exception)
{
ShowMessage("Your XML was probably bad...");
}
答案 1 :(得分:27)
此问题会将“well-formed”与“valid”XML文档混淆。
根据定义,有效的xml文档是一个格式良好的文档。 另外,它必须满足DTD或架构(xml schema,relaxng schema,schematron或other constraints)有效的。
从问题的措辞来看,很可能会问:
“如何确保文件包含格式良好的XML文档?”。
答案是,如果XML文档可以通过兼容的XML解析器成功解析,那么它就是格式良好的。由于XDocument.Load()方法正是如此,您只需要捕获异常,然后得出结论文件中包含的文本格式不正确。
答案 2 :(得分:10)
只需加载它并捕获异常。对于File.Exists()
也是如此 - 文件系统是 volatile ,因为File.Exists()
返回true并不意味着您将能够打开它。
答案 3 :(得分:3)
如果你有XML的XSD,试试这个:
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
答案 4 :(得分:1)
如前所述,“有效的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...
}
}
}
答案 5 :(得分:1)
根据接受的答案,我不会XDocument.Load();你为什么要将整个文件读入内存,它可能是一个巨大的文件?
我可能会将前几个字节读入byteArray(甚至可能是任何二进制文件),将byteArray转换为字符串
例如System.Text.Encoding.ASCII.GetString(byteArray)
,检查转换的字符串是否包含您期望的Xml元素,然后继续。
答案 6 :(得分:0)
我知道此线程已使用12年了,但我仍然想添加我的解决方案,因为我在其他任何地方都找不到它。 我认为您想要的只是一种检查文件是否为xml文件的方式,而不是文件的结构是否正确或其他任何方式。 (这就是我对问题的理解)。
我找到了一种方法来轻松检查文件是否为xml文件(或您需要的任何文件,该文件适用于任何东西),并且它将是以下代码行:
new System.IO.FileInfo(filePath).Extension == ".xml"
只需将“ filePath”替换为文件的路径,就可以了。您可以将语句放在期望布尔值的任何地方。
您可以像这样使用它:
boolean isXmlFile = new FileInfo("c:\\config.xml").Extension == ".xml" //will return true