如何按XML的req属性值分组插入节点,求PowerShell或C#实现方案
PowerShell 实现方案
首先修正原有代码的执行顺序问题(需先加载XML文件再查询节点),再按req属性分组逻辑调整插入规则:
# 配置参数 $XMLPATH = "替换为你的XML文件实际路径" $parentRev = "20Sub3" # 要插入子节点的父节点rev属性值 $newRev = "20Sub3Fix6" $newNver = "2.3.6.1111" $newReq = "true" # 加载XML文件 [xml]$bookInfo = Get-Content -Raw -Path $XMLPATH # 查询目标父节点 $parentNode = (Select-Xml -Xml $bookInfo -XPath "//*[@rev='$parentRev']").Node # 创建新Book节点 $newBook = $bookInfo.CreateNode("element", "Book", "") $newBook.SetAttribute("rev", $newRev) $newBook.SetAttribute("nver", $newNver) $newBook.SetAttribute("req", $newReq) # 按分组规则插入节点 if ($newReq -eq "true") { # 查找父节点下第一个req=true的子节点 $firstTrueNode = $parentNode.SelectSingleNode("Book[@req='true'][1]") if ($null -ne $firstTrueNode) { # 插在所有true节点最前面 $parentNode.InsertBefore($newBook, $firstTrueNode) | Out-Null } else { # 没有true节点时找第一个false节点,插在false组最前面保证true组在前 $firstFalseNode = $parentNode.SelectSingleNode("Book[@req='false'][1]") if ($null -ne $firstFalseNode) { $parentNode.InsertBefore($newBook, $firstFalseNode) | Out-Null } else { # 没有任何子节点时直接插在开头 $parentNode.PrependChild($newBook) | Out-Null } } } else { # 查找父节点下第一个req=false的子节点 $firstFalseNode = $parentNode.SelectSingleNode("Book[@req='false'][1]") if ($null -ne $firstFalseNode) { # 插在所有false节点最前面 $parentNode.InsertBefore($newBook, $firstFalseNode) | Out-Null } else { # 没有false节点时直接插在所有子节点末尾,保证在true组后面 $parentNode.AppendChild($newBook) | Out-Null } } # 保存修改后的XML $bookInfo.Save($XMLPATH)
C#/.NET 实现方案
基于XmlDocument实现
using System; using System.Xml; namespace XmlEditDemo { class Program { static void Main(string[] args) { string xmlPath = @"替换为你的XML文件实际路径"; string parentRev = "20Sub3"; string newRev = "20Sub3Fix6"; string newNver = "2.3.6.1111"; string newReq = "true"; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(xmlPath); // 查找父节点 XmlNode parentNode = xmlDoc.SelectSingleNode($"//*[@rev='{parentRev}']"); if (parentNode == null) return; // 创建新节点 XmlElement newBook = xmlDoc.CreateElement("Book"); newBook.SetAttribute("rev", newRev); newBook.SetAttribute("nver", newNver); newBook.SetAttribute("req", newReq); if (newReq == "true") { XmlNode firstTrue = parentNode.SelectSingleNode("Book[@req='true'][1]"); if (firstTrue != null) { parentNode.InsertBefore(newBook, firstTrue); } else { XmlNode firstFalse = parentNode.SelectSingleNode("Book[@req='false'][1]"); if (firstFalse != null) { parentNode.InsertBefore(newBook, firstFalse); } else { parentNode.PrependChild(newBook); } } } else { XmlNode firstFalse = parentNode.SelectSingleNode("Book[@req='false'][1]"); if (firstFalse != null) { parentNode.InsertBefore(newBook, firstFalse); } else { parentNode.AppendChild(newBook); } } xmlDoc.Save(xmlPath); } } }
基于LINQ to XML(XDocument)实现,代码更简洁
using System.Linq; using System.Xml.Linq; namespace XDocEditDemo { class Program { static void Main(string[] args) { string xmlPath = @"替换为你的XML文件实际路径"; string parentRev = "20Sub3"; string newRev = "20Sub3Fix6"; string newNver = "2.3.6.1111"; string newReq = "true"; XDocument xDoc = XDocument.Load(xmlPath); XElement parentNode = xDoc.Descendants().FirstOrDefault(e => e.Attribute("rev")?.Value == parentRev); if (parentNode == null) return; // 创建新节点 XElement newBook = new XElement("Book", new XAttribute("rev", newRev), new XAttribute("nver", newNver), new XAttribute("req", newReq)); var childNodes = parentNode.Elements("Book").ToList(); if (newReq == "true") { var firstTrue = childNodes.FirstOrDefault(e => e.Attribute("req")?.Value == "true"); if (firstTrue != null) { firstTrue.AddBeforeSelf(newBook); } else { var firstFalse = childNodes.FirstOrDefault(e => e.Attribute("req")?.Value == "false"); if (firstFalse != null) { firstFalse.AddBeforeSelf(newBook); } else { parentNode.AddFirst(newBook); } } } else { var firstFalse = childNodes.FirstOrDefault(e => e.Attribute("req")?.Value == "false"); if (firstFalse != null) { firstFalse.AddBeforeSelf(newBook); } else { parentNode.Add(newBook); } } xDoc.Save(xmlPath); } } }
内容的提问来源于stack exchange,提问作者mystack
相关产品推荐
相关产品推荐

