方法已执行但无效

Lai*_*290 4 c# logic class object

我正在创建一个操作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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有什么问题?

Ser*_*kiy 5

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

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

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

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

因此,您最终会得到全新对象的图形,这些对象与先前加载xml期间创建的对象无关.加载xml后,实例XmlDocument 保持相同,但内部有完全新的对象.