解析内部XML分支

时间:2013-09-23 13:24:44

标签: c# xml xpath syntax xml-parsing

我有一个XML文件,如下所示:

<Directories>
    <directory name="name1" info="blahblah" otherInfo="blahblah">
        <file fileName="name"  path="" />
    </directory>

    <directory name="name2" info="blahblah" otherInfo="blahblah">
        <file fileName="name"  path="" />
    </directory>

    <directory name="name3" info="blahblah" otherInfo="blahblah">
        <file fileName="name"  path="" />
    </directory>
</Directories>

我使用以下代码解析相关分支以更新目录/文件信息:

XmlDocument objLog = new XmlDocument();
objLog.Load(path);

//update directory info
foreach (XmlNode objNode in objLog.SelectNodes("/Directories/directory"))
{
    XmlElement objUpdatedNode = objLog.CreateElement("directory");
    objUpdatedNode.SetAttribute("name", "NAME");
    objUpdatedNode.SetAttribute("info", "INFO");
    objUpdatedNode.SetAttribute("otherInfo", "OTHERINFO");

    //update file information
    foreach (XmlNode objFileNode in 
             objLog.SelectNodes("/Directories/directory/file"))
    {
        XmlElement objFileNode = objLog.CreateElement("file");
        objFileNode.SetAttribute("fileName", "FILENAME");
        objFileNode.SetAttribute("path", "PATH");

        objLog.SelectNodes("/Directories")[0]
              .ReplaceChild(objUpdatedNode, objNode);         
        objUpdatedNode.AppendChild(objUpdatedFileNode);
    }

    objLog.Save(path);
}

如果XML文件中只有目录,代码就像我期望的那样工作,但是如果我有多个条目,则会在尝试多次解析文件节点和XML文件时抛出错误永远不会更新。如果我删除了代码的更新文件信息部分,则目录分支正确更新。如何更新目录及其关联的内部文件分支?

1 个答案:

答案 0 :(得分:2)

您无需创建/删除元素。只需按照以下方式更新它们

XmlDocument objLog = new XmlDocument();
objLog.Load(path);

//update directory info
foreach (XmlElement objNode in objLog.SelectNodes("/Directories/directory"))
{
    objNode.SetAttribute("name", "NAME");
    objNode.SetAttribute("info", "INFO");
    objNode.SetAttribute("otherInfo", "OTHERINFO");

    //update file information
    foreach (XmlElement objFileNode in objNode.ChildNodes)
    {
        objFileNode.SetAttribute("fileName", "FILENAME");
        objFileNode.SetAttribute("path", "PATH");
    }
}

// Done Updating - Save
objLog.Save(path);

我更改了foreach循环以使用XmlElement,这使您可以访问SetAttribute方法。循环只是遍历节点并进行更新。