2013-11-21 58 views
0

這就是我所謂的「購買Bills.xml」 XML文件,其中票據是根:迭代之間有兩個XML節點選擇值使用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> 

我有我的表格上的兩個組合框各自含有所有時間我XML文件(2個相同的列表)。假設在comboBox1中,我選擇了文件中的第一個日期,並在comboBox2中選擇了最後一個日期(或者第三個......無論如何),我如何從這兩個日期之間獲得所有價格的總和(不僅是這兩個選定日期價格的總和也是兩者之間的價格總和)......這就像是從包含第一個日期的節點X和包含第二個日期的所有節點Z到包含第二個日期的節點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) 
      }; 

現在你可以綁定賬單組合框。使用Date作爲顯示成員,並使用TotalPrice作爲值成員。或者你只是可以搜索選定日期的總價:

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

更新:下面的查詢返回幾個日期的總價:

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文件....請看看我添加在特里的評論回答你將確切知道我想要什麼,...謝謝。 – Xavier1819

0

您的問題,似乎有什麼要問的是選擇的一個在組合框中的日期,你想總結包含對象的各個List的價格,我猜的類型就像產品或類似的東西,例如,在你的XML中有2個Bill對象,如果你選擇了日期(在組合框中)第二個比爾對象,只有1個對象在列表中(因此只有1個價格),你想得到這個價格,如果這是你需要的然後喲u能與數據綁定實現它,一個粗實例如下:

更新: 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; } 
} 

而且它每次你選擇在組合框中一個diferent日期,你會得到相關的比爾實例的所有價格的總和。

+0

我欣賞你的努力,但我的問題是,我想從comboBox 1和日期2形式comboBox 2中選擇日期1(comboBoxes 1和2包含我的XML文件中的所有日期值,它們都包含相同的列表)[不僅選擇一個日期,而且選擇兩個],並嘗試獲取其中所有價格的總和。 p.s.我的XML文件包含比這更多的節點。再次感謝。 – Xavier1819

+0

這就像我想在XML文件中的兩個給定節點之間穿行(基於兩個組合框的值)並從中間獲得一個特定的值....是可能的? – Xavier1819

+0

現在每次在任何組合框中選擇日期時,現在更新文本框將顯示兩個選定日期的結果。 – terrybozzio