Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中读取和更改xml文件_C#_.net_Xml - Fatal编程技术网

C# 如何在C中读取和更改xml文件

C# 如何在C中读取和更改xml文件,c#,.net,xml,C#,.net,Xml,非常感谢您阅读我的问题 这是我的xml文件。对于节点歌曲,许多子节点命名为歌曲 <?xml version="1.0" encoding="utf-8" ?> <xmlData> <version>1.0</version> <Songs> <Song> <artist>mic</artist> <track>

非常感谢您阅读我的问题

这是我的xml文件。对于节点歌曲,许多子节点命名为歌曲

<?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文件呢? 也许,我会改变一些歌曲中的子节点,并可能删除整个chindNode的艺术家关键字

是否可以使用此功能 波尔·德雷特桑比艺术家、弦乐演奏家; bool changenodeingstring sArtist,字符串sNodeName,字符串值

因为读取解决方案是XmlDucoment,所以最好使用XmlDocument更改解决方案

但是,如果您对读取和更改xml文件有更好的想法,请给我示例代码。。。请不要写解决方案的名称,比如Ling to xml…实际上,我做了很多测试,但都失败了。

欢迎使用Stackoverflow

只需设置一个新的.Value或在您的案例中为.InnerText,即可更改节点

样品 更多信息 欢迎来到Stackoverflow

只需设置一个新的.Value或在您的案例中为.InnerText,即可更改节点

样品 更多信息
您需要使用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]);
                }
            }

        }
    }
你可能想把它清理得更干净一点,让它更有弹性。当您调用它时,将初始代码更改为如下所示。不要创建子文档,因为您希望使用整个XmlDocument

    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");

        }
    }

您需要使用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]);
                }
            }

        }
    }
你可能想把它清理得更干净一点,让它更有弹性。当您调用它时,将初始代码更改为如下所示。不要创建子文档,因为您希望使用整个XmlDocument

    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");

        }
    }

您无法保存更改,因为您对一个全新的文档进行了更改

您可能打算执行以下操作:

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);

您无法保存更改,因为您对一个全新的文档进行了更改

您可能打算执行以下操作:

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);
请不要写一个解决方案的名称,比如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();
请不要写一个解决方案的名称,比如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();
你可以

//告诉它在文档中的任意位置选择歌曲节点。这比

        doc.SelectNodes(@"/document/level1/music/Songs")
请注意,上面的语句并非针对xml,而是为了证明关于xml的一点// 使用//可以消除对docSub文档和SongsNode元素的需要。 要添加然后删除歌曲,只需使用以下命令

这就是一切。

你可以做的

//告诉它在文档中的任意位置选择歌曲节点。这比

        doc.SelectNodes(@"/document/level1/music/Songs")
请注意,上面的语句并非针对xml,而是为了证明关于xml的一点// 使用//可以消除对docSub文档和SongsNode元素的需要。 要添加然后删除歌曲,只需使用以下命令


这就是它的全部内容。

或者只需doc.SavenewFileName@erlvde:在代码的中途创建了一个全新的XmlDocument,有什么原因吗?我的回答是假设这是一个错误,因为我无法预见这样做的任何有用的理由@erlvde:在代码的中途创建了一个全新的XmlDocument,有什么原因吗?我的回答是假设这是一个错误,因为我无法预见这样做的任何有用的理由。谢谢您的回答,但如果更改,我认为,必须首先找到它,然后将新值设置为InnerText,但如何保存它?例如我的示例代码中的docSub,如果docSub.Save,它只保存临时memroy docSub,而不是doc。我认为,只有doc可以更改硬盘中的xml文件。你怎么想的?@erlvde我不明白。您可以使用save方法保存文件。嗯……真的很抱歉,我不知道如何保存。我可以通过XmlDocument读取xml,也可以通过set方法更改innertext。对于版本标签,我们使用c

请在docmy代码中更改它,但对于歌曲标签,它不是在doc中,而是在docSub中,这就是为什么我感到困惑。如果保存,则应保存文档,但在docSub中进行更改。您是否尝试保存更改docSub并保存文档?它有效吗?你的意思是,更改docSub然后保存doc,xml将保存在硬盘中?对不起,我不知道。我稍后会尝试,我现在在车上,无法编译代码。但是还有一件事,改变不仅仅是改变一些节点的内部文本,如何删除一首歌,或者如何添加一首歌?非常感谢您的帮助。谢谢您的回答,但如果更改,我认为,必须首先找到它,然后将新值设置为InnerText,但如何保存它?例如我的示例代码中的docSub,如果docSub.Save,它只保存临时memroy docSub,而不是doc。我认为,只有doc可以更改硬盘中的xml文件。你怎么想的?@erlvde我不明白。您可以使用save方法保存文件。嗯……真的很抱歉,我不知道如何保存。我可以通过XmlDocument读取xml,也可以通过set方法更改innertext。对于版本标签,我们可以在docmy代码中更改它,但对于歌曲标签,它不在doc中,而是在docSub中,这就是为什么我感到困惑的原因。如果保存,则应保存文档,但在docSub中进行更改。您是否尝试保存更改docSub并保存文档?它有效吗?你的意思是,更改docSub然后保存doc,xml将保存在硬盘中?对不起,我不知道。我稍后会尝试,我现在在车上,无法编译代码。但是还有一件事,改变不仅仅是改变一些节点的内部文本,如何删除一首歌,或者如何添加一首歌?非常感谢你的帮助,谢谢。xmlWriter..事实上,我以前试过。在保存之前,我们必须先在我的代码中更改文档。所以问题是:1:如何更改文档?2:如何将文档值分配给xmlwriter?对不起,我将更新我的代码。对于2,第一个示例将文档写入xml编写器,第二个示例不需要xml编写器。已使用删除问题更新。您可以使用类似的方法更改文本,而不是删除节点,更改您想要更改的Xml。谢谢。xmlWriter..事实上,我以前试过。在保存之前,我们必须先在我的代码中更改文档。所以问题是:1:如何更改文档?2:如何将文档值分配给xmlwriter?对不起,我将更新我的代码。对于2,第一个示例将文档写入xml编写器,第二个示例不需要xml编写器。已使用删除问题更新。您可以使用类似的方法来更改文本,而不是删除节点来更改您想要更改的Xml。谢谢,我知道您的意思。这是我对代码的困惑,因为我当时创建了一个新的XmlDocument,我不知道如何保存它。你能再帮我一个问题吗?如何删除子歌曲或添加歌曲?如布尔·德雷特桑比亚特、弦乐萨提斯;bool changenodeingstring sArtist,字符串sNodeName,字符串值;我已经更新了我的答案,向您展示了如何查找和删除节点,以及如何添加新节点。谢谢,我知道您的意思。这是我对代码的困惑,因为我当时创建了一个新的XmlDocument,我不知道如何保存它。你能再帮我一个问题吗?如何删除子歌曲或添加歌曲?如布尔·德雷特桑比亚特、弦乐萨提斯;bool changenodeingstring sArtist,字符串sNodeName,字符串值;我已经更新了答案,向您展示了如何查找和删除节点,以及如何添加新节点。呵呵。我不想抱怨…但事实是…我工作了很多天,休息很少…我的大脑对新事物不好。。。如果方便的话,我会问你更多关于学习灵的问题。呵呵。我不想抱怨…但事实是…我工作了很多天,休息很少…我的大脑对新事物不好。。。如果方便的话,我会问你更多如果学习凌。