2013-11-21 4 views
0

Это мой файл XML называется «Покупка Bills.xml», где СЧЕТА корень:Итерация между двумя XML Node Выбранные значения с помощью C#

<?xml version="1.0" encoding="utf-8"?> 
<BILLS> 
    <BILL> 
    <DATE>24/11/2013 10:55:08 ص</DATE> 
    <LIST> 
     <NAME>Corded Cyclonic Stick Vacuum</NAME> 
     <NUMBER>2</NUMBER> 
     <PRICE>159.98</PRICE> 
     <NAME>Table Fan</NAME> 
     <NUMBER>3</NUMBER> 
     <PRICE>239.97</PRICE> 
     <NAME>Kenmore Elite 31.0 cu. ft. French Door Bottom-Freezer Refrigerator</NAME> 
     <NUMBER>1</NUMBER> 
     <PRICE>1999.99</PRICE> 
     <NAME>Electric Freestanding Range 700 Series</NAME> 
     <NUMBER>1</NUMBER> 
     <PRICE>1999.00</PRICE> 
     <NAME>Rocky 2 Washer</NAME> 
     <NUMBER>2</NUMBER> 
     <PRICE>1970.00</PRICE> 
    </LIST> 
    </BILL> 
    <BILL> 
    <DATE>21/11/2013 02:09:15 ص</DATE> 
    <LIST> 
     <NAME>Air Steerable Bagless Upright</NAME> 
     <NUMBER>3</NUMBER> 
     <PRICE>569.97</PRICE> 
     <NAME>Table Fan</NAME> 
     <NUMBER>5</NUMBER> 
     <PRICE>399.95</PRICE> 
     <NAME>Kenmore 25.4 cu. ft. Side-by-Side Refrigerator</NAME> 
     <NUMBER>3</NUMBER> 
     <PRICE>2399.97</PRICE> 
     <NAME>Electric Freestanding Range 700 Series</NAME> 
     <NUMBER>2</NUMBER> 
     <PRICE>3998.00</PRICE> 
     <NAME>Rocky 2 Washer</NAME> 
     <NUMBER>4</NUMBER> 
     <PRICE>3940.00</PRICE> 
    </LIST> 
    </BILL> 
    <BILL> 
    <DATE>21/11/2013 02:03:25 ص</DATE> 
    <LIST> 
     <NAME>Corded Cyclonic Stick Vacuum</NAME> 
     <NUMBER>3</NUMBER> 
     <PRICE>239.97</PRICE> 
    </LIST> 
    </BILL> 
    <BILL> 
    <DATE>21/11/2013 01:57:55 ص</DATE> 
    <LIST> 
     <NAME>Quietforce Bagged Canister</NAME> 
     <NUMBER>2</NUMBER> 
     <PRICE>299.99</PRICE> 
     <NAME>Table Fan</NAME> 
     <NUMBER>5</NUMBER> 
     <PRICE>79.99</PRICE> 
     <NAME>Kenmore 18.2 cu. ft. Top-Freezer Refrigerator</NAME> 
     <NUMBER>4</NUMBER> 
     <PRICE>499.99</PRICE> 
     <NAME>Electric Slide-in Range 700 Series</NAME> 
     <NUMBER>7</NUMBER> 
     <PRICE>2,499.00</PRICE> 
     <NAME>Rocky 2 Washer</NAME> 
     <NUMBER>6</NUMBER> 
     <PRICE>985.00</PRICE> 
    </LIST> 
    </BILL> 
</BILLS> 

У меня на форме два ComboBoxes каждый из которых содержит все даты из моих XML-файл (2 идентичных списка). Скажем, в comboBox1 я выбрал первую дату в файле, а в comboBox2 я выбрал последнюю дату (или, может быть, третью ... что угодно), как я могу получить сумму всех цен между этими двумя датами (не только сумма двух выбранных дат, но также и сумма цен между ними) .... это похоже на изменение всех цен от узла X, который содержит первую дату и весь путь до узла Z, который содержит вторую дату и вычисление сумма. И как говорится в названии с использованием C#. Заранее спасибо ребята :)

ответ

1

Вы можете использовать Linq для Xml:

var xdoc = XDocument.Load(fileName); 
var bills = from b in xdoc.Descendants("BILL") 
      group b by (string)b.Element("DATE") into g 
      select new { 
       Date = g.Key, 
       TotalPrice = g.Element("LIST")        
           .Elements("PRICE") 
           .Sum(p => (decimal)p) 
      }; 

Теперь вы можете связать счета для ComboBox. Используйте Date в качестве отображаемого элемента, а TotalPrice в качестве значения. Или вы можете просто найти общую стоимость выбранной даты:

var price = bills.First(b => b.Date == date).TotalPrice; 

UPDATE: После запроса возвращает стоимость нескольких дат:

string[] dates = // get selected dates 
var price = bills.Where(b => dates.Contains(b.Date)) 
       .Sum(b => b.TotalPrice); 
+0

спасибо, Но есть ли способ, который я могу просто сделать двумя выражениями, основанными на выборе двух комбинированных ящиков и итерации между ними? – Xavier1819

+0

@ Xavier1819 извините, не получилось - вы хотите получить данные из xml-файлов или хотите генерировать выражение xpath? –

+0

Я вроде бы новичок в программировании, чтобы быть честным, поэтому, я думаю, я не смог правильно выбрать свои слова .... да, я хочу получить XML-файл формы данных ... пожалуйста, посмотрите комментарии, которые я добавил на махровые ответ u будет точно знать, что я хочу, спасибо. – Xavier1819

0

Каких кажется ваш вопрос будет просить выбирает один из даты в поле со списком, которое вы хотите суммировать цены соответствующего списка, который содержит объекты, которые, как я полагаю, имеют тип, например Продукт или что-то подобное, например, в вашем xml есть два объекта Билла, если вы выбрали дату (в поле со списком) второй объект Билла, который имеет только 1 объект в списке (поэтому только 1 цена), вы хотели бы получить эту цену, если это то, что вам нужно, тогда yo и можно достичь его привязки данных, грубый пример следующим образом:

ОБНОВЛЕНО: 1) объявить BindingSource в своей форме, например:

private BindingSource source = new BindingSource(); 
private BindingSource SecondSource = new BindingSource(); 

2), то в вашем месте загрузки формы этот код (переименование выпадающий и имя файла XML):

var serializer = new XmlSerializer(typeof(List<Bill>)); 

using(var reader = new StreamReader("YourFileNameHere.xml")) 
{ 
    try 
    { 
     source.DataSource = (List<Bill>)serializer.Deserialize(reader); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

SecondSource.DataSource = source; 
comboBox1.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged); 
comboBox2.SelectedIndexChanged += new EventHandler(comboBox_SelectedIndexChanged); 

comboBox1.DisplayMember = "Date"; 
comboBox2.DisplayMember = "Date"; 
comboBox1.DataSource = source; 
comboBox2.DataSource = SecondSource; 

3) следующий ивент-обработчик для выбранного индекса изменения:

void comboBox_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var query = from combo in this.Controls.OfType<ComboBox>().Where(c => c.SelectedItem != null) 
       select ((Bill)combo.SelectedItem).Products.Sum(p => p.Price); 
    textBox1.Text = query.Aggregate((d, a) => d + a).ToString(); 
} 

4) Еще одна вещь, по вашему xml, было бы лучше сформировать ее лучше, добавив атрибуты в ваш класс Bill. Если ваш класс Bill имеет только 2 члена, дату и список, это следующее приведет к созданию более структурированного xml:

[Serializable] 
[XmlRootAttribute(IsNullable = false, ElementName = "Bills",Namespace ="")] 
public class Bill 
{ 
    [XmlElement("Date")] 
    public DateTime Date {get;set;} 

    [XmlArray(ElementName = "Products")] 
    public List<Product> Products { get; set; } 
} 

И что каждый раз, когда вы выбираете дату в с различной выпадающим списком, вы получите сумму всех цен, связанные с этим экземпляром Билла.

+0

. Я ценю усилия ура. Но мой вопрос состоял в том, что я хочу выбрать дату 1 из comboBox 1 и date 2 form comboBox 2 (comboBoxes 1 & 2 содержит все значения дат из моего xml-файла, они содержат и идентичный список) [НЕ выбирают только одну дату, но два] и пытаются получить сумму всех цен среди них. стр. мой XML-файл содержит больше узлов, чем это. еще раз спасибо. – Xavier1819

+0

Это как я хочу пройти через два заданных узла в моем XML-файле (на основе значений двух comboBoxes) и получить конкретное значение из ... это возможно ??? – Xavier1819

+0

Обновлено каждый раз, когда вы выбираете дату в любом поле со списком, в текстовом поле будут отображаться результаты обеих выбранных дат. – terrybozzio

 Смежные вопросы

  • Нет связанных вопросов^_^