如何向现有XML文档添加多个带自定义属性的同名<app>节点?
解决XML中添加多个同名节点的问题
嘿,看来你在给现有XML添加
方法一:用LINQ to XML(推荐,和你一开始的XDocument适配)
因为你一开始就用了XDocument,那咱们就顺着这个体系来,LINQ to XML的API写起来更清爽:
先加载你的现有XML文档
不管是从文件加载还是从字符串加载,都很简单:// 从文件加载 XDocument doc = XDocument.Load("你的XML文件路径.xml"); // 如果是从字符串加载的话,用这个 // string xmlContent = "<body><setting>...</setting></body>"; // XDocument doc = XDocument.Parse(xmlContent);找到
节点
咱们要把新的节点加到这个节点下面: XElement settingNode = doc.Root.Element("setting"); // 万一找不到<setting>节点,就新建一个加上去 if (settingNode == null) { settingNode = new XElement("setting"); doc.Root.Add(settingNode); }创建并添加多个独立的
节点
每个节点可以自由设置自己的属性,完全不会互相覆盖:// 第一个新app:带owner属性 XElement writeApp = new XElement("app", new XAttribute("name", "write.exe"), new XAttribute("folder", @"c:\windows\system32\"), new XAttribute("owner", "jane") ); settingNode.Add(writeApp); // 第二个新app:带age属性 XElement paintApp = new XElement("app", new XAttribute("name", "mspaint.exe"), new XAttribute("folder", @"c:\windows\system32\"), new XAttribute("age", "5") ); settingNode.Add(paintApp); // 想加多少就加多少,每个都可以自定义属性保存修改后的XML
doc.Save("你的XML文件路径.xml");
方法二:用传统的System.Xml API(XmlDocument)
如果你更习惯用老的XmlDocument体系,也可以这么写:
XmlDocument doc = new XmlDocument(); doc.Load("你的XML文件路径.xml"); // 定位到<setting>节点 XmlNode settingNode = doc.SelectSingleNode("/body/setting"); if (settingNode == null) { settingNode = doc.CreateElement("setting"); doc.DocumentElement.AppendChild(settingNode); } // 创建第一个app节点并设置属性 XmlElement writeApp = doc.CreateElement("app"); writeApp.SetAttribute("name", "write.exe"); writeApp.SetAttribute("folder", @"c:\windows\system32\"); writeApp.SetAttribute("owner", "jane"); settingNode.AppendChild(writeApp); // 创建第二个app节点 XmlElement paintApp = doc.CreateElement("app"); paintApp.SetAttribute("name", "mspaint.exe"); paintApp.SetAttribute("folder", @"c:\windows\system32\"); paintApp.SetAttribute("age", "5"); settingNode.AppendChild(paintApp); // 保存 doc.Save("你的XML文件路径.xml");
为啥你原来的代码不行?
你之前写的System.Xml.XmlElement appnew = new System.Xml.XmlElement("<app name=\"write.exe\" folder=\"c:\\windows\\system32\\\">")是错误的——XmlElement的构造函数只接受节点名称,不能直接传完整的XML标签字符串。而且你同时用了XDocument和XmlElement,这两个属于不同的XML处理体系,混用容易出各种奇怪的问题,所以建议统一用其中一种~
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

