【问题标题】:How to check if XmlDocument has changed?如何检查 XmlDocument 是否已更改?
【发布时间】:2013-03-19 13:09:35
【问题描述】:

我在代码的各个部分有条件地更改XmlDocumentXmlDocument 对象没有为此传递“已更改”标志,而是为此构建了某些标志(例如 isDirty)?

var doc = new XmlDocument();
doc.Load(file);

if (...) parent.AppendChild(element);
if (...) parent2.AppendChild(element2);
if (...) parent3.AppendChild(element3);

//METHOD DOESN'T EXIST
if (doc.isDirty())
  doc.Save(file);

【问题讨论】:

    标签: c# .net xml c#-4.0


    【解决方案1】:

    虽然 XmlDocument 没有公开 IsDirty 标志,但它确实具有像 NodeChangedNodeInsertedNodeRemoved,您可以使用它来保留单个标志,您不需要将其传递给任何突变方法:

    var doc = new XmlDocument();
    doc.Load(file);
    
    bool changed = false;
    
    XmlNodeChangedEventHandler handler = (sender, e) => changed = true;
    doc.NodeChanged += handler;
    doc.NodeInserted += handler;
    doc.NodeRemoved += handler;
    
    // do some work
    
    if (changed)
        doc.Save(file);
    

    【讨论】:

    • 啊,好地方。我仍然建议将其包装在一个暴露标志的对象中 - 否则您的序列化代码还将处理 XmlDocument 上的更改跟踪。最好有一个特定的对象来处理它
    • 我要补充一点,依赖事件来查看文档何时更改有点奇怪/懒惰。毕竟,您是编写代码来更改它的人!
    【解决方案2】:

    不,XmlDocument 存储一个文档,它不跟踪更改。将其包装在一个帮助类中,按照您的描述设置一个标志,或者创建一些其他 OO 结构以按照您想要的方式工作。

    【讨论】:

    • 传递更改的标志似乎是乱扔垃圾。你有什么建议吗?
    • 您大概有一个明确定义的类/方法来修改 XML,如果没有,请先修复它。然后应该有一个清晰,整洁的地方来放置一面旗帜。如果您打算经常这样做,请从 XmlDocument(或者更好的是 XDocument)派生并巧妙地实现该功能。如果你需要存储一个标志,你需要存储一个标志..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多