在 c# 中替换 XML

本文关键字:XML 替换 | 更新日期: 2023-09-27 17:57:01

我试图使用 ReplaceChild 函数。 代码有效,并且没有抛出任何异常,但是当我将XML打印到屏幕上时,似乎该函数不起作用。 原始节点是新节点,但不是新节点。

private void convertClubComp(XmlDocument doc)
    {
        XmlNode sessionNode = doc.SelectSingleNode("Session");
        XmlNode clubsNode = doc.CreateNode(XmlNodeType.Element, "Clubs", "");
        XmlNode playerNode = sessionNode.SelectSingleNode("Players").SelectSingleNode("Player");
        XmlNode groupNode = sessionNode.SelectSingleNode("Players").SelectSingleNode("Player").SelectSingleNode("Groups");
        Console.WriteLine(playerNode.Name);
        clubsNode = doc.ImportNode(groupNode, true);
        playerNode.ReplaceChild(clubsNode, sessionNode.SelectSingleNode("Players").SelectSingleNode("Player").SelectSingleNode("Groups"));
        Console.WriteLine(clubsNode.FirstChild.FirstChild.Name);
        Console.WriteLine("!"+playerNode.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.Name);

    }

谢谢

在 c# 中替换 XML

好的,当你执行 ImportNode() 时,它会用另一个节点的克隆替换你对你创建的新节点的引用。我认为您正在寻找的是类似于以下内容的内容:

    private void convertClubComp(XmlDocument doc)
    {
        XmlNode sessionNode = doc.SelectSingleNode("Session");
        XmlNode playerNode = sessionNode.SelectSingleNode("Players").SelectSingleNode("Player");
        XmlNode groupNode = playerNode.SelectSingleNode("Groups");
        Console.WriteLine(playerNode.Name);
        XmlNode clubsNode = doc.CreateElement("Clubs", "");
        foreach (XmlNode child in groupNode.ChildNodes)
        {
            clubsNode.AppendChild(child.CloneNode(true));
        }
        foreach (XmlAttribute attribute in groupNode.Attributes)
        {
            clubsNode.Attributes.Append((attribute.Clone() as XmlAttribute));
        }
        playerNode.ReplaceChild(clubsNode, groupNode);
        Console.WriteLine(clubsNode.FirstChild.FirstChild.Name);
        Console.WriteLine("!" + playerNode.FirstChild.NextSibling.NextSibling.NextSibling.NextSibling.NextSibling.Name);
    }

另外,如果您已经有引用,请不要使用 SelectSingleNode() 或 SelectNodes()。这确实是很糟糕的做法,在较大的系统中可能会扼杀您的表现。