确定xml文件是否包含数据 - c#

时间:2009-08-11 12:34:34

标签: c#

我如何知道我的XML文件是否还有名称空间信息以外的数据:

有些文件包含:

<?xml version="1.0" encoding="UTF-8"?>

如果我遇到这样的文件,我想将文件放在错误目录

7 个答案:

答案 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方法。