2013-03-19 90 views
2

我在條件的各個部分有條件地更改XmlDocument。而不是傳遞一個「改變」的旗幟,XmlDocument對象是否有一些內置標誌(例如isDirty)?如何檢查XmlDocument是否發生了變化?

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); 

回答

4

雖然的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); 
+0

啊,好點。我仍然建議將它包裝在暴露標誌的對象中 - 否則你的序列化代碼也將處理XmlDocument上的變化跟蹤。最好有一個特定的對象來處理這個問題 – 2013-03-19 13:31:48

+0

我想補充一點,依靠事件來查看文檔更改的時間有點奇怪/懶惰。畢竟,你是編寫代碼來改變它的人! – 2013-03-19 16:09:16

2

不,XmlDocument存儲文檔,它不會跟蹤更改。將它包裝在一個助手類中,按照你所描述的設置一個標誌,或者創建一些其他的OO結構來按你想要的方式工作。

+0

傳遞更改標誌周圍似乎像亂拋垃圾。你有什麼建議去哪裏? – TruMan1 2013-03-19 13:13:54

+1

你大概有一個明確定義的類/方法來修改XML,如果沒有,首先修復它。那麼應該有一個乾淨利落的地方來保持國旗。如果你打算經常這樣做,從XmlDocument派生(或者更好的可能是XDocument)並且整齊地實現這個功能。如果你需要存儲一個標誌,你需要存儲一個標誌。 – 2013-03-19 13:14:58