You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 06:57:03