方法已执行,但不起作用

本文关键字:不起作用 执行 方法 | 更新日期: 2023-09-27 18:31:16

我正在创建一个用于操作XML的类,我创建了方法RemoveNode的重载

public partial class HWXml
{
    public string XmlFile;
    private XmlDocument XmlDoc = new XmlDocument();
    public HWXml(string XmlFile)
    {
        this.XmlFile = XmlFile;
    }
    public XmlNode SelectSingleNode(string NodePath)
    {
        XmlDoc.Load(XmlFile);
        return XmlDoc.SelectSingleNode(NodePath);
    }
    public void RemoveNode(XmlNode removeChild)
    {
        XmlDoc.Load(XmlFile);
        removeChild.ParentNode.RemoveChild(removeChild);
        XmlDoc.Save(XmlFile);
    }
    public void RemoveNode(string RemoveChild)
    {
        XmlDoc.Load(XmlFile);
        XmlNode removeChild = XmlDoc.SelectSingleNode(RemoveChild);
        removeChild.ParentNode.RemoveChild(removeChild);
        XmlDoc.Save(XmlFile);
    }
}

当我尝试使用字符串参数删除节点时,它可以工作

private void RemoveXML_Click(object sender, RoutedEventArgs e)
{
    MyXmlClass myXmlClass = new MyXmlClass(XmlFile);
    myXmlClass.RemoveNode("root/Content");
}

但是当我尝试使用 XmlNode 参数删除节点时,它将编译、执行、没有错误消息,但没有效果,它不会删除 XML 文件中的任何内容。

private void RemoveXML_Click(object sender, RoutedEventArgs e)
{
    MyXmlClass myXmlClass = new MyXmlClass(XmlFile);
    XmlNode node = myXmlClass.SelectSingleNode("root/Conteudo");
    myXmlClass.RemoveNode(node);
}

问题是什么?

方法已执行,但不起作用

XmlNode参数绝对不是您在此方法中加载XmlDoc的一部分(因为在加载文档之前您有此节点)。因此,此节点上的操作不会影响文档哪个节点不属于。

在第二种情况下,您正在选择已加载的文档的节点。这个节点属于刚刚加载到XmlDoc的xml树,因此删除节点会影响文档。

您应该了解的是XmlDocument(与XDocument相同)是如何加载的:

  1. 如果它有一些节点(以前加载),则删除所有节点
  2. 创建XmlReader
  3. 此读取器逐个节点读取输入流
  4. 对于每个找到的节点,将创建适当类的新实例并将其添加到文档中(例如,如果读者读取了某个元素,则创建新的XmlElement并将其添加到文档的当前元素中)

因此,您最终会得到与先前加载 xml 期间创建的对象无关的全新对象的图形。加载 xml 后,XmlDocument 的实例保持不变,但它内部有全新的对象。