Я считаю, что этот код делает все, что вы хотите, чтобы ваш код делал. Этот код, конечно, не идеален и может даже не работать, но если вы сравните его с вашим, вы обнаружите, что он использует, вероятно, полдюжины методов, которых вы не придерживаетесь в своем коде, и, вероятно, так и должно быть. Если вы удалите все утверждения, вы обнаружите, что это всего 10 строк кода (не считая рефакторинг метода).
if (line.StartsWith("Builder_email:"))
{
Debug.Assert(
line.Where(x => x == '\t').Count() > 2),
"Can't parse input line.");
string builderEmail = line.Split('\t')[3];
Debug.Assert(
builderEmail != null && builderEmail == builderEmail.Trim(),
"Input data is bad.");
string filename = @"C:\GUI\buildermanageremail.xml"
Debug.Assert(
File.Exists(filename),
"Expected XML file does not exist.");
XmlDocument emailXml = new XmlDocument();
emailXml.Load(filename);
// In your real application, you know the name of the document element, so you
// should replace * with it in the XPath below.
string xpath = string.Format(
"/*/builderemail/builder/value[.='{0}']",
builderEmail);
if (emailXml.SelectSingleNode(xpath) == null)
{
CreateBuilderEmailElement(emailXml, builderEmail);
emailXml.Save(filename);
// I've changed the name of this method, which is problematic for several
// reasons - not least of which is that in my world, at least, "DDL" means
// "Data Definition Language."
//
// This also assumes that you've created an overload of the method that
// takes an XmlDocument argument.
PopulateEmailComboBox(emailXml);
}
// I'm assuming that the builderEmail is the actual text value stored in the
// combo box items, in which case all you need to do is find the item with that
// value and set SelectedItem, which will automatically set SelectedIndex. Also,
// if the value isn't found, setting SelectedItem to null automatically sets
// SelectedIndex to -1.
builderEmailComboBox.SelectedItem = builderEmailComboBox.Items
.Where(x => x.ToString() == builderEmail)
.FirstOrNull();
}
А вот метод создания элемента builderemail
, который, кстати, должен называться builderEmail
, если вы хотите сказать о нем:
// this is refactored out as its own function, and made internal so that you
// can unit test it.
internal void CreateBuilderEmailElement(XmlDocument emailXml, string builderEmail)
{
XmlElement builder = emailXml.CreateNode("builder");
XmlElement value = emailXml.CreateNode("value");
builder.AppendChild(valueElm);
value.InnerText = builderEmail;
// again, you know the name of the document element in your application,
// so replace the * below with it.
Debug.Assert(
emailXml.SelectSingleNode("/*/builderemail") != null,
"No builderemail element found under the document element.");
emailXml.SelectSingleNode("/*/builderemail").AppendChild(builder);
}
Кроме того, есть ли причина, по которой в вашем XML есть отдельный элемент value
в builderEmail
вместо builderEmail
, просто содержащий значение?