2013-07-25 3 views
0

Я написал метод, который загружает значения из xml-файла в textBoxes.LINQ to XML обрабатывает дубликаты

private void load(TreeNodeMouseClickEventArgs e) 
{ 
    XDocument doc = XDocument.Load(@"test.xml"); 
    string nodeName = e.Node.Text; 

    var data = from q in doc.Descendants("dog") 
       where (string)q.Attribute("name") == nodeName 
       select new Data 
       { 
        name = q.Attribute("name").Value, 
        breed = q.Element("breed").Value, 
        sex = q.Element("sex").Value 
       }; 


    foreach (var element in data) 
    { 
     textBox1.Text = element.name; 
     textBox2.Text = element.breed; 
     comboBox1.Text = element.sex; 
    } 
} 

Он отлично работает до тех пор, как я не буду добавлять другую собаку с тем же name, но разные breed. Мой файл XML выглядит следующим образом:

<dogs> 
<dog name="Mike"> 
<breed>dachshund</breed> 
<sex>true</sex> 
</dog> 
<dog name="Mike"> 
<breed>husky</breed> 
<sex>true</sex> 
</dog> 
</dogs> 

Когда я пытаюсь значение нагрузки от второго узла, ничего не происходит, так как запись с именем Mike была найдена ранее. Пробовал использовать списки, но это не сработало (или просто я сделал что-то не так). Я хочу разрешить такие «дубликаты», только дубликаты 1: 1 являются forriben (уже написана эта часть, и она работает). Если бы был способ получить breed аналогичным образом, так как я получаю name, это решит проблему - просто добавьте еще where в запрос.

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    nodeName = e.Node.Text; 
} 

Вот как я получаю name - нажав на нужный узел в treeView. Если есть более одной записи, названной так же, она загружает только последние. Поэтому мой вопрос: как с этим бороться? Очевидно, что может быть собака по имени Том, порода дач и собака по имени Том, хлеб хриплый.

+0

Когда вы назначаете значение в текстовое поле в цикле, у вас будет назначено только последнее значение. Чего вы пытаетесь достичь? –

+0

Да, вы правы, это моя проблема. Я хочу иметь возможность загружать определенный узел, но пока, если есть два узла с одним и тем же «именем», он загружает последнюю, несмотря ни на что. Как @ Жан-Бернард Пеллерин, я могу использовать другое свойство, тег. – PotatoBox

+0

Это winforms или веб-приложение? –

ответ

1

Используйте Tag, а не Text.

Вам нужно будет изменить, как вы заполняете свое дерево, но вы можете назначить конкретный объект или значение Node.Tag, а затем получить его позже. Это может содержать идентификатор или потенциально всю информацию о данной собаке. Затем в вашем методе treeView1_NodeMouseClickTreeNodeMouseClickEventArgs e будет содержать гораздо больше информации, чем только отображаемый текст.