0

次のような 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ファイルは更新されません. また、コードのファイル情報の更新部分を取り除くと、ディレクトリ ブランチが正しく更新されます。ディレクトリとそれに関連する内部ファイル ブランチの両方を更新するにはどうすればよいですか?

4

1 に答える 1

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ループを使用するように変更しました。ループは、ノードと更新を反復するだけです。XmlElementSetAttribute

于 2013-09-23T14:22:22.750 に答える