1

私の質問を読んでくれてありがとう。

これは私のxmlファイルです。(ノード Songs の場合、Song という名前の多数の子ノード)

<?xml version="1.0" encoding="utf-8" ?>
<xmlData>
    <version>1.0</version>
    <Songs>
        <Song>
            <artist>mic</artist>
            <track>2</track>
            <column>happy</column>
            <date>14</date>
        </Song>
        <Song>
            <artist>cool</artist>
            <track>2</track>
            <column>work</column>
            <date>4</date>
        </Song>
    </Songs>
</xmlData>

xml を読んで、次のコードを使用します。

        XmlDocument doc = new XmlDocument();
        doc.Load(xmlFilePath);

        XmlNode versionNode = doc.SelectSingleNode(@"/xmlData/version");
        Console.WriteLine(versionNode.Name + ":\t" + versionNode.InnerText);

        XmlNode SongsNode = doc.SelectSingleNode(@"/xmlData/Songs");
        Console.WriteLine(SongsNode.Name + "\n");

        XmlDocument docSub = new XmlDocument();
        docSub.LoadXml(SongsNode.OuterXml);

        XmlNodeList SongList = docSub.SelectNodes(@"/Songs/Song");

        if (SongList != null)
        {
            foreach (XmlNode SongNode in SongList)
            {
                XmlNode artistDetail = SongNode.SelectSingleNode("artist");
                Console.WriteLine(artistDetail.Name + "\t: " + artistDetail.InnerText);

                XmlNode trackDetail = SongNode.SelectSingleNode("track");
                Console.WriteLine(trackDetail.Name + "\t: " + trackDetail.InnerText);

                XmlNode columnDetail = SongNode.SelectSingleNode("column");
                Console.WriteLine(columnDetail.Name + "\t: " + columnDetail.InnerText);

                XmlNode dateDetail = SongNode.SelectSingleNode("date");
                Console.WriteLine(dateDetail.Name + "\t: " + dateDetail.InnerText + "\n");

            }
        }

それは働いているようです。しかし、どうすればxmlファイルに変更を書き込むことができますか? たぶん、Song の childNode をいくつか変更し、アーティストのキーワードで chindNode 全体を削除するかもしれません。

この関数のように可能ですか bool DeleteSongByArtist(string sArtist); bool ChangeNodeInSong(string sArtist, string sNodeName, string value);

「読み込み解は「XmlDucoment」なので、「XmlDocument」を使って「解を変える」方が良い

しかし、xml ファイルを読んで変更するより良いアイデアがある場合は、サンプル コードを教えてください... "Ling to xml" などのソリューションの名前を書かないでください...実際、私は多くのテストを行っています、しかし失敗しました。

4

5 に答える 5

4

スタックオーバーフローへようこそ!

.Valuenewまたは を設定するだけで、ノードを変更できます.InnerText

サンプル

// change the node
trackDetail.InnerText = "NewValue"
// save the document
doc.Save(xmlFilePath);

詳しくは

于 2012-04-18T18:11:20.223 に答える
1

XmlWriter を使用する必要があります。それを行う最も簡単な方法は、次のようなものです...

using(XmlWriter writer = new XmlWriter(textWriter))
{
   doc.WriteTo(writer);
}

textWriter は、初期化されたテキスト ライターです。

実際には、忘れてください...最も簡単な方法は電話することです...

doc.Save(xmlFilePath);

アーティスト名でアーティストを削除するには、次のメソッドを追加します。

    bool DeleteSongByArtist(XmlDocument doc, string artistName)
    {
        XmlNodeList SongList = doc.SelectNodes(@"/Songs/Song");
        if (SongList != null)
        {
            for (int i = SongList.Count - 1; i >= 0; i--)
            {
                if (SongList[i]["artist"].InnerText == artistName && SongList[i].ParentNode != null)
                {
                    SongList[i].ParentNode.RemoveChild(SongList[i]);
                }
            }

        }
    }

回復力を高めるために、もう少しクリーンアップすることをお勧めします。呼び出すときは、初期コードを次のように変更します。subDocumentXmlDocument 全体を操作したいので、 を作成しないでください。

    XmlDocument doc = new XmlDocument();
    doc.Load(xmlFilePath);

    XmlNode versionNode = doc.SelectSingleNode(@"/xmlData/version");
    Console.WriteLine(versionNode.Name + ":\t" + versionNode.InnerText);

    XmlNode SongsNode = doc.SelectSingleNode(@"/xmlData/Songs");
    Console.WriteLine(SongsNode.Name + "\n");

    XmlNodeList SongList = doc.SelectNodes(@"/Songs/Song");

    if (SongList != null)
    {
        foreach (XmlNode SongNode in SongList)
        {
            XmlNode artistDetail = SongNode.SelectSingleNode("artist");
            Console.WriteLine(artistDetail.Name + "\t: " + artistDetail.InnerText);

            XmlNode trackDetail = SongNode.SelectSingleNode("track");
            Console.WriteLine(trackDetail.Name + "\t: " + trackDetail.InnerText);

            XmlNode columnDetail = SongNode.SelectSingleNode("column");
            Console.WriteLine(columnDetail.Name + "\t: " + columnDetail.InnerText);

            XmlNode dateDetail = SongNode.SelectSingleNode("date");
            Console.WriteLine(dateDetail.Name + "\t: " + dateDetail.InnerText + "\n");

        }
    }
于 2012-04-18T18:11:53.060 に答える
0

まったく新しいドキュメントに変更を加えたため、変更を保存できません!

次のことを意図していた可能性があります。

XmlNode SongsNode = doc.SelectSingleNode(@"/xmlData/Songs");
Console.WriteLine(SongsNode.Name + "\n");

// Don't make a new XmlDocument here! Use your existing one
XmlNodeList SongList = SongsNode.SelectNodes(@"/Song");

この時点SongListでは、まだ内部に住んでい docます。今あなたが呼び出すとき:

doc.Save(xmlFilePath);

意図したとおりに変更が保存されます。

特定の基準に一致するノードを削除する場合:

// Use XPath to find the matching node
XmlNode song = SongsNode.SelectSingleNode(@"/Song[artist='" + artist + "']");

// Remove it from its Parent
SongsNode.RemoveChild(song);

新しいノードを追加する場合:

// Create the new nodes using doc
XmlNode newSong = doc.CreateElement("Song");

XmlNode artist = doc.CreateElement("artist");
artist.InnerText = "Hello";

// Begin the painstaking process of creation/appending
newSong.AppendChild(artist);

// rinse...repeat...

// Finally add the new song to the SongsNode
SongsNode.AppendChild(newSong);
于 2012-04-18T18:24:07.890 に答える
0

「Ling to xml」などの解決策の名前を書かないでください...実際、私は多くのテストを行いましたが、失敗しました。

それでも、これは Linq2Xml の使用を開始する非常に良い時期だと思います。嫌なら無視すればいい。

XDocument xDoc = XDocument.Load(new StringReader(xml));

//Load Songs
var songs = xDoc.Descendants("Song")
                .Select(s => new
                {
                    Artist = s.Element("artist").Value,
                    Track = s.Element("track").Value,
                    Column = s.Element("column").Value,
                    Date = s.Element("date").Value,
                })
                .ToArray();

//Delete Songs
string songByArtist="mic";
xDoc.Descendants("Song")
    .Where(s => s.Element("artist").Value == songByArtist)
    .Remove();
string newXml = xDoc.ToString();
于 2012-04-18T19:02:31.413 に答える
0

あなたができる

        XmlNodeList SongList = doc.SelectNodes(@"//Songs/Song");

// は、ドキュメント内の任意の場所で Songs ノードを選択するように指示します。これはよりも優れています

        doc.SelectNodes(@"/document/level1/music/Songs")

上記のステートメントは明らかに xml 用ではありませんが、//を使用することで
// docSub ドキュメントと SongsNode 要素が不要になることを証明するために注意してください。曲を追加して削除するには、次のようにします

        XmlDocument doc = new XmlDocument();
        XmlElement ea = doc.SelectSingleNode("//songs");
        XmlElement el = doc.CreateElement("song");
        XmlElement er;
        ea.AppendChild(el);
        //doing my work with ea
        //you could use innerxml.
        el.InnerXml = "<artist>Judas Priest</artist><track>7</track><column>good</column><date>1</date>";
        //or you can treat each node as above
        er = doc.CreateElement("Name");
        el.AppendChild(er);
        er.InnerText = "The Ripper";
        //but you don't nead this song any more?
        ea.RemoveChild(el);
        //so it's gone.

それだけです。

于 2012-04-18T19:05:43.127 に答える