views:

48

answers:

1

I need to get data from a XML file from Node1>Node2

Filter data to group from the xml by X Node where X node is equals A,Y,Z..

Group all elements with same X Node value ordered by date

Store first element of the group(as ordered by date would be by the latest), and the rest in a subgroup of the same object.

If in the filter fails to find one Node equals(A,X or Z) then it creates an first element with hardcoded data for the fist element.

Once this process is finish then send the object (list<>) to a repeater.

I have nearly everything but I don’t know how to do it for when the filter fails to find a Node that is equals to (A,X or Z)

Code Example.

   private void BindOutputRepeaterLongTermCondition()
                {

          XDocument xd = XDocument.Parse(element.OuterXml);

                if (xd != null)
                {

                    var results = (from el1 in xd.Descendants("Node1")
                                   from el2 in el1.Descendants("Node2")
                                   where el2.Element("Date") != null    
                               &&(el2.Element("Code").Value.StartsWith("A") 
                                   || el2.Element("Code").Value.StartsWith("Y")
                                   || el2.Element("Code").Value.StartsWith("Z")
                                   || el2.Element("Code").Value.StartsWith("B")
                                   )
                                   orderby el2.Element("Date").Value descending
                                   group el2 by el2.Element("Code").Value
                                       into CodeGroup
                                       select new Table(CodeGroup.First())
                                       {
                                           SubTable = (from subCodes in CodeGroup
                                                           select new Table(subCodes)).Skip(1).ToList()
                                       }).ToList<Table>();




                     this.repeaterTable.DataSource = results;
                     this.repeaterTable.DataBind();


                }

            }



            protected void repeater_Table_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
            {
                RepeaterItem item = e.Item;
                if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem))
                {
                    var recentTable = (Table)item.DataItem;
                    var TableRepeater = (Repeater)item.FindControl("rptSubTable");
                    TableRepeater.DataSource = recentTable.SubTable;
                    TableRepeater.DataBind();
                }
            }


        }

        public class Table
        {
            public string Date { get; set; }
            public string Rubric { get; set; }
            public string Value { get; set; }
            public List<Table> SubTable { get; set; }



            public Table(XElement xml)
            {


                Date = xml.Element("Date") != null ? xml.Element("Date").Value : "";
                Code = xml.Element("Code") != null ? xml.Element("Code").Value : "";

                var a = (string)xml.Element("Code").Value;

                if (a.StartsWith("A"))
                {
                    Name = "Row 1";
                }
                else if (a.StartsWith("Y"))
                {
                    Name = "Row 2";
                }
                else if (a.StartsWith("Z"))
                {
                    Name = "Row 3";
                }

                else if (a.StartsWith("B"))
                {
                    Name = "Row 4";
                }

//Tried the following but it does not work.
                else if (!a.StartsWith("A") && !a.StartsWith("Y") && !a.StartsWith("B")){
                 Name = "Row 3";
                 Value = "Not Found";
                 }
              }

        }

XML Code example

<Node1>
    <Node2>
        <Date>2009-07-16</Date>
        <Code>A</Code>
        <Value>Some Value</Value>
    </Node2>
    <Node2>
        <Date>2008-02-09</Date>
        <Code>Y</Code>
        <Value>Some Value</Value>
    </Node2>
    <Node2>
        <Date>2008-02-09</Date>
        <Code>Z</Code>
        <Value>Some Value</Value>           
    </Node2>
    <Node2>
        <Date>2008-07-16</Date>
        <Code>A</Code>
        <Value>Some Value</Value>
    </Node2>
    <Node2>
        <Date>2006-02-09</Date>
        <Code>Y</Code>
        <Value>Some Value</Value>
    </Node2>
    <Node2>
        <Date>2001-02-09</Date>
        <Code>Z</Code>
        <Value>Some Value</Value>           
    </Node2>
 </Node1>

Any help would be appreciated.

Update The problem is that I need to display all elements whether they are on the xml or not. At the moment I can only display existing elements. If one of the elements (by "Code") is not found I need to display hardcoded name of the element and value "No Value".

+1  A: 

Instead of the final elseif:

else if (!a.StartsWith("A") && !a.StartsWith("Y") && !a.StartsWith("B")){
                 Name = "Row 3";
                 Value = "Not Found";
                 }

Have you tried

else
{
Name = "Row n";
Value = "Not Found";
}

It should just fall through to that branch if all other conditions are not met (unless I am missing something)

adrianos
@adrianos:Thanks, I tried that, but it does not fall, as at the creation of the Table object is filtering everything that is empty or do not match the filter criteria (the selected Codes in this case.).
Cesar Lopez
Oh ok, I'll take a look when free but good luck in the meantime.
adrianos
Hi Cesar, how come you marked this as the answer? I thought it didn't solve the problem!
adrianos