internal void EmitChanged(XmlElement root) { var xml = root.OwnerDocument; foreach (var v in _original.Values) { if (!_values.ContainsKey(v.Field.Id)) { var e = xml.CreateElement("custom_field"); var attr = xml.CreateAttribute("id"); attr.Value = XmlConvert.ToString(v.Field.Id); e.Attributes.Append(attr); root.AppendChild(e); } } foreach (var v in _values.Values) { CustomFieldValue original; if (_original.TryGetValue(v.Field.Id, out original) && original.Value == v.Value) { continue; } var e = xml.CreateElement("custom_field"); var attr = xml.CreateAttribute("id"); attr.Value = XmlConvert.ToString(v.Field.Id); e.Attributes.Append(attr); var ev = xml.CreateElement("value"); RedmineUtility.EmitString(ev, v.Value); e.AppendChild(ev); root.AppendChild(e); } }