Linq to XML добавление в список Проблема отправить на ретранслятор - PullRequest
1 голос
/ 22 октября 2010

Мне нужно получить данные из XML-файла из Node1> Node2

Фильтрация данных для группировки из xml по X-узлу, где узел X равен A, Y, Z ..

Сгруппируйте все элементы с одинаковым значением X-узла, упорядоченным по дате

Сохраните первый элемент группы (в порядке упорядочения по дате будет самым последним), а остальные элементы - в подгруппе того же объекта.

Если в фильтре не удается найти один узел, равный (A, X или Z), то он создает первый элемент с жестко закодированными данными для первого элемента.

После завершения этого процесса отправьте объект (список).<>) к повторителю.

У меня есть почти все, но я не знаю, как это сделать, когда фильтру не удается найти узел, равный (A, X или Z) * ​​1013 *

Пример кода.

   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

<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>

Любая помощь приветствуется.

Обновление Проблема заключается в том, чтоМне нужно отобразить все элементы, независимо от того, находятся они на XML или нет.На данный момент я могу отображать только существующие элементы.Если один из элементов (по «Коду») не найден, мне нужно отобразить жестко закодированное имя элемента и значение «Нет значения».

1 Ответ

1 голос
/ 25 октября 2010

Вместо окончательного остатка:

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

Вы пробовали

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

Это должно просто провалиться в эту ветку, если все остальные условия не выполнены (если я что-то упустил)

...