帮忙看看这个xml文件如何修改选中的节点信息?

lonejacky 2008-05-23 10:00:11
xml结构如下
<webSiteList>
<site>
<siteName>雅虎网站</siteName>
<itemlist>网址</itemlist>
<itemlist>网站介绍</itemlist>
</site>
<site>
<siteName>网易网站</siteName>
<itemlist>网址</itemlist>
<itemlist>网站介绍</itemlist>
<itemlist>其他信息</itemlist>
</site>
</webSiteList>

比如说现在读取了下面这条信息,但怎么才能修改保存呢?
<siteName>雅虎网站</siteName>
<itemlist>网址</itemlist>
<itemlist>网站介绍</itemlist>
我用下面的方法不行!


string[] ChildNodess = SiteChildNodeStr.Split(new char[] { '\r' });
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strXmlPath);
XmlNode node = xmlDoc.SelectSingleNode("/webSiteList/site[siteName='" + SiteNameNodeStr + "']");
node["siteName"].InnerText = ModifySiteNameStr;

for (int i = 0; i < ChildNodess.Length; i++)
{
node["itemlist"].InnerText = ChildNodess[i].ToString().Replace("\r","").Replace("\n","");
}
...全文
366 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
funlove999 2008-05-23
  • 打赏
  • 举报
回复
你要改哪几个节点,哪个节点对应的textbox名字
我们哪知道啊....你不如把示意图整出来,我们帮你写好得了,省得你麻烦,我们也麻烦
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
不好意思,根据funlove999的改进了一下就搞定了,不过,很感谢大家,马上把分散给大家。
下面是我改的。
string[] ChildNodess = SiteChildNodeStr.Split(new char[] { '\r' });
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strXmlPath);
XmlNode node = xmlDoc.SelectSingleNode("/webSiteList/site[siteName='" + SiteNameNodeStr + "']");
node["siteName"].InnerText = ModifySiteNameStr;

for (int i = 0; i < ChildNodess.Length; i++)
{
node.ChildNodes[i+1].InnerText = ChildNodess[i].ToString().Replace("\r","").Replace("\n","");
}
xmlDoc.Save(strXmlPath);
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 funlove999 的回复:]
GG,你想改成啥样....
我哪知道你要改什么节点,改什么值,只是参考啊
[/Quote]
改的值是从Textbox中读取的,就是选中哪一条的SiteName就改哪一条的全部信息,明白了吗?
csharp_start 2008-05-23
  • 打赏
  • 举报
回复

string xmlFile = Application.StartupPath + @"\a.XML";
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile);
XmlNode root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
if (node.LocalName.Equals("site"))
{
if (node.FirstChild.InnerText == "雅虎网站")
{
foreach (XmlNode childnode in node.ChildNodes)
{
if (childnode.Name == "itemlist")
{
childnode.InnerText = childnode.InnerText + "aaa";
}
}
}
}
}
StreamWriter sw = new StreamWriter(xmlFile, false, Encoding.GetEncoding("UTF-8"));
XmlTextWriter xw = new XmlTextWriter(sw);

xw.Formatting = Formatting.Indented;

doc.Save(xw);
sw.Close();
funlove999 2008-05-23
  • 打赏
  • 举报
回复
GG,你想改成啥样....
我哪知道你要改什么节点,改什么值,只是参考啊
csharp_start 2008-05-23
  • 打赏
  • 举报
回复

string xmlFile = Application.StartupPath + @"\a.XML";
XmlDocument doc = new XmlDocument();
doc.Load(xmlFile);
XmlNode root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)
{
if (node.LocalName.Equals("site"))
{
if (node.FirstChild.InnerText == "雅虎网站")
{
foreach (XmlNode childnode in node.ChildNodes)
{
if (childnode.InnerText != "雅虎网站")
{
childnode.InnerText = childnode.InnerText + "aaa";
}
}
}
}
}
StreamWriter sw = new StreamWriter(xmlFile, false, Encoding.GetEncoding("UTF-8"));
XmlTextWriter xw = new XmlTextWriter(sw);

xw.Formatting = Formatting.Indented;

doc.Save(xw);
sw.Close();
HappinessBoy 2008-05-23
  • 打赏
  • 举报
回复
注意判断每次获得的节点是否为null
HappinessBoy 2008-05-23
  • 打赏
  • 举报
回复
xmlDoc.SelectSingleNode("/webSiteList....")得到的节点是websitelist,
你要修改<siteName>雅虎网站</siteName> 为 @雅虎网站@,
那么你应该要SelectSingleNode到siteName节点,即
XmlNode node =xmlDoc.SelectSingleNode("webSiteList").SelectSingleNode("site").SelectSingleNode("siteName");
node.InerText ="@雅虎网站@";
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
也就是说
node["siteName"].InnerText = ModifySiteNameStr;
不起作用了。
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 funlove999 的回复:]
C# code
string[] ChildNodess = SiteChildNodeStr.Split(new char[] { '\r' });
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strXmlPath);
XmlNode node = xmlDoc.SelectSingleNode("/webSiteList/site[siteName='" + SiteNameNodeStr + "']");
node["siteName"].InnerText = ModifySiteNameStr;

for (int i = 0; i < ChildNodess.Length; i++)
{
node.childNodes[i].InnerText = "test";
}
xmlDoc.Sa…
[/Quote]
我试了,这样是可以改,但同时也把节点node["siteName"]的值也改了。
funlove999 2008-05-23
  • 打赏
  • 举报
回复

string[] ChildNodess = SiteChildNodeStr.Split(new char[] { '\r' });
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(strXmlPath);
XmlNode node = xmlDoc.SelectSingleNode("/webSiteList/site[siteName='" + SiteNameNodeStr + "']");
node["siteName"].InnerText = ModifySiteNameStr;

for (int i = 0; i < ChildNodess.Length; i++)
{
node.childNodes[i].InnerText = "test";
}
xmlDoc.Save(strXmlPath);
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhzuo 的回复:]
如果是带命名空间,那查询的时候参考下面的代码

C# code
//xml查询带命名空间
XmlDocument doc = new XmlDocument();
doc.Load("C:\\nso.xml");
NameTable xmt = new NameTable();
XmlNamespaceManager xnm = new XmlNamespaceManager(xmt);
xnm.AddNamespace("ns0", "http://blog.csdn.net/zhzuo");
XmlNode node = doc.SelectSingleNode("//ns0:NewDataSet/ns0:Table1", xnm);



//如果是默认命名…
[/Quote]
我不是要查询啊,我是要修改
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhzuo 的回复:]
C# code
using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Collections;
using System.Data;
using System.Xml;
using System.Management;
using System.Net;


namespace Zhzuo
{
class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
string strXml="<?xml version=\"1…
[/Quote]

情况不一样啊,你看一下我的<itemlist>是有N项,不是固定的
marvelstack 2008-05-23
  • 打赏
  • 举报
回复
如果是带命名空间,那查询的时候参考下面的代码

//xml查询带命名空间
XmlDocument doc = new XmlDocument();
doc.Load("C:\\nso.xml");
NameTable xmt = new NameTable();
XmlNamespaceManager xnm = new XmlNamespaceManager(xmt);
xnm.AddNamespace("ns0", "http://blog.csdn.net/zhzuo");
XmlNode node = doc.SelectSingleNode("//ns0:NewDataSet/ns0:Table1", xnm);



//如果是默认命名空间,可以添加别名进行查询。
XmlDocument doc = new XmlDocument();
doc.Load("C:\\m.xml");
NameTable xmt = new NameTable();
XmlNamespaceManager xnm = new XmlNamespaceManager(xmt);
//默认命名空间添加nn别名。
xnm.AddNamespace("ns0", "http://blog.csdn.net/zhzuo");
XmlNode node = doc.SelectSingleNode("//ns0:NewDataSet/ns0:Table1", xnm);
marvelstack 2008-05-23
  • 打赏
  • 举报
回复

using System;
using System.IO;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Collections;
using System.Data;
using System.Xml;
using System.Management;
using System.Net;


namespace Zhzuo
{
class ZZConsole
{
[STAThread]
static void Main(string[] args)
{
string strXml="<?xml version=\"1.0\"?>"
+"<Data>"
+"<Head>"
+"<Nodeid>1111</Nodeid>"
+"<Subid>2222</Subid>"
+"<Version>2004</Version>"
+"<Date>20040302</Date>"
+"<Time>101500</Time>"
+"</Head>"
+"<Body>"
+"<Code>01</Code>"
+"<Name>深圳</Name>"
+"<IdType>0</IdType>"
+"<Idno>110258740824082</Idno>"
+"</Body>"
+"</Data>";
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXml);
string vv;

XmlNodeList myNodes = doc.GetElementsByTagName("Version");
vv = myNodes[0].InnerText;
//修改
myNodes[0].InnerText = "123455";
Console.WriteLine(vv);
myNodes = doc.SelectNodes("//Version");
vv = myNodes[0].InnerText;
Console.WriteLine(vv);
//修改
myNodes[0].InnerText = "67890";
doc.Save("d:\\text.xml");
Console.ReadLine();
}

}

}
funlove999 2008-05-23
  • 打赏
  • 举报
回复

xmlDoc.Save(strXmlPath);
lonejacky 2008-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csharp_start 的回复:]
XmlDoc.Save();
[/Quote]
我倒,这个我只是没贴出来!

我贴出的那个代码执行了没反应。
HappinessBoy 2008-05-23
  • 打赏
  • 举报
回复
错误 1 “Save”方法没有采用“0”个参数的重载
csharp_start 2008-05-23
  • 打赏
  • 举报
回复
XmlDoc.Save();

111,116

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧