C# 如何在C中读取和更改xml文件
非常感谢您阅读我的问题 这是我的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 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,字符串值;我已经更新了答案,向您展示了如何查找和删除节点,以及如何添加新节点。呵呵。我不想抱怨…但事实是…我工作了很多天,休息很少…我的大脑对新事物不好。。。如果方便的话,我会问你更多关于学习灵的问题。呵呵。我不想抱怨…但事实是…我工作了很多天,休息很少…我的大脑对新事物不好。。。如果方便的话,我会问你更多如果学习凌。