LINQ to XML с использованием объединений - PullRequest
1 голос
/ 21 июня 2010

У меня есть XML файл в следующем формате, где action type=0 - настройки по умолчанию.

Actiontype 1 и 2 - настройки переопределения.Поэтому, когда настройки типа 1 или 2 доступны в XML, они должны переопределять настройки по умолчанию.

Чтобы переопределить идентификаторы полей типа по умолчанию = 0, я пытаюсь выполнить соединение с идентификатором поляпереопределить type = 1, чтобы я мог получить значения type = 1 и использовать их в своем приложении.Однако соединение не работает.Есть ли лучший способ переопределить значения по умолчанию?

Тип = 0 всегда доступен, но будет передан либо Тип = 1, либо Тип = 2.

Есть ли другой способ сделать этос отражением?

XML

<ActionTypes>
    <ActionType Type="0">
        <Field Id="Label1" Name="StartDate" ComparePreviousYear="False" CompareCurrentYear="True"></Field>
        <Field Id="Label2" Name="EndDate" ComparePreviousYear="False" CompareCurrentYear="True"></Field>
        <Field Id="Label3" Name="Cost" ComparePreviousYear="True" CompareCurrentYear="False"></Field>
        <Field Id="Label4" Name="Total" ComparePreviousYear="False" CompareCurrentYear="False"></Field>
    </ActionType>
    <ActionType Type="1">
        <Field Id="Label3" Name="Cost" ComparePreviousYear="True" CompareCurrentYear="True"></Field>
    </ActionType>
    <ActionType Type="2">
        <Field Id="Label2" Name="EndDate" ComparePreviousYear="True" CompareCurrentYear="True"></Field>
    </ActionType>
</ActionTypes>

Код

IEnumerable<XElement> defaultFields = from test in defaultElements.Elements()
                                        where test.Attribute("Type").Value == "0"
                                        select test;

IEnumerable<XElement> overrideFields = from test in defaultElements.Elements()
                                         where test.Attribute("Type").Value == "1"
                                         select test;

var overrideFields = from dflt in dftElements.Elements("Field")
                       join ovrd in ovrElements.Elements("Field") on dflt.Attributes("Id") equals ovrd.Attributes("Id")
                       select dflt,ovrd;

Ответы [ 2 ]

0 голосов
/ 21 июня 2010

Это работает, если я правильно понял ваше требование

   class Program
    {
        static void Main(string[] args)
        {
            XDocument xd = XDocument.Load("Test.xml");
            var defaultElements = xd.Document.Element("ActionTypes");


            IEnumerable<XElement> defaultFields = from test in defaultElements.Elements()
                                                  where test.Attribute("Type").Value == "0"
                                                  select test;

            IEnumerable<XElement> overrideFields = from test in defaultElements.Elements()
                                                   where test.Attribute("Type").Value == "1"
                                                   select test;

            var ovFields = from dflt in defaultFields.Elements("Field")
                           join x in overrideFields.Elements("Field") on dflt.Attribute("Id").Value equals x.Attribute("Id").Value
                           into g
                           from ovrd in g.DefaultIfEmpty()
                           select (ovrd == null ? dflt : ovrd);
            foreach (var x in ovFields.SelectMany(y=>y.Attributes()))
                Console.WriteLine("{0}           {1}", x.Name, x.Value);

            Console.ReadLine();

        }



    }
0 голосов
/ 21 июня 2010

Вы должны использовать Attribute здесь вместо Attributes:

join ovrd in ovrElements.Elements("Field")
    on dflt.Attributes("Id") equals ovrd.Attributes("Id")

На самом деле вы сравниваете два IEnumerable<XAttribute> на равенство, которое будет использовать простое эталонное сравнение - которое никогда не будет истинным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...