我如何知道我的XML文件是否还有名称空间信息以外的数据:
有些文件包含:
<?xml version="1.0" encoding="UTF-8"?>
如果我遇到这样的文件,我想将文件放在错误目录
中答案 0 :(得分:4)
您可以使用XmlReader来避免XmlDocument的开销。在您的情况下,您将收到异常,因为缺少根元素。
string xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
using (StringReader strReader = new StringReader(xml))
{
//You can replace the StringReader object with the path of your xml file.
//In that case, do not forget to remove the "using" lines above.
using (XmlReader reader = XmlReader.Create(strReader))
{
try
{
while (reader.Read())
{
}
}
catch (XmlException ex)
{
//Catch xml exception
//in your case: root element is missing
}
}
}
您可以在检查第一个节点后在while(reader.Read())循环中添加条件,以避免读取整个xml文件,因为您只想检查根元素是否缺失。
答案 1 :(得分:2)
我认为唯一的方法是在尝试加载时捕获异常,如下所示:
try
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
doc.Load(Server.MapPath("XMLFile.xml"));
}
catch (System.Xml.XmlException xmlEx)
{
if (xmlEx.Message.Contains("Root element is missing"))
{
// Xml file is empty
}
}
是的,有一些开销,但无论如何你都应该进行这样的健全性检查。你永远不应该信任输入,唯一能够可靠地验证它的方法是将XML视为XML,看看.NET对它的看法!
答案 2 :(得分:2)
XmlDocument xDoc = new XmlDocument();
if(xDoc.ChildNodes.Count == 0) {// xml文档为空}
if(xDoc.ChildNodes.Count == 1) {//在xml文档中只是声明节点。 (如果你不确定声明总是在开头}
if(xDoc.ChildNodes.Count&gt; 1) {//有声明+ n个节点(通常这个计数是2;声明+根节点)}
答案 3 :(得分:1)
没试过......但是应该可以。
try
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
}
catch (XmlException exc)
{
//invalid file
}
编辑:根据反馈意见
对于大型XML文档,请参阅Thomas's回答。这种方法可能会出现性能问题。 但是,如果它是一个有效的xml并且程序想要处理它,那么这种方法似乎更好。
答案 4 :(得分:0)
如果您不担心有效性,请检查第一个之后是否有任何内容?&gt;。我不完全确定C#语法(因为我使用它已经太久了),但是读取文件,查找?&gt;的第一个实例,并查看该索引之后是否有任何内容。
但是,如果您希望稍后使用XML,或者希望稍后处理XML,则应考虑PK's answer并将XML加载到XmlDocument
对象中。但是如果您有大型XML文档而不需要处理,那么更像我的解决方案,将文件作为文本读取,可能会减少开销。
答案 5 :(得分:0)
您可以检查xml文档是否有节点(根节点),并检查该节点是否包含内部文本或其他子节点。
答案 6 :(得分:0)
只要您不关心XML文档的有效性,并且只想确保它具有声明以外的标记,您就可以使用简单的文本处理:
var regEx = new RegEx("<[A-Za-z]");
bool foundTags = false;
string curLine = "";
using (var reader = new StreamReader(fileName)) {
while (!reader.EndOfStream) {
curLine = reader.ReadLine();
if (regEx.Match(curLine)) {
foundTags = true;
break;
}
}
}
if (!foundTags) {
// file is bad, copy.
}
请记住,文件可能无效还有一百万个其他原因,上面的代码将验证仅包含“&lt; a”的文件。如果您的目的是验证XML文档是否能够被读取,那么您应该使用XmlDocument方法。