Click here to Skip to main content
15,885,842 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
I have selected my drop down id is 2080. how to mapping two document with where condition? How to filter my data using linq C#?

First XML DOCUMENT

XML
<hostgroup id="2080">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id="2061">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id="2062">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id="2063">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>


Second XML DOCUMENT

XML
<hoststatuslist>
 <hoststatus id="49294">  
    <host_id>2061</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR13</display_name>
    <alias>management_servers</alias>
    <status_update_time>2015-09-19 08:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id="49294">  
    <host_id>2062</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR14</display_name>
    <alias>linux_servers</alias>
    <status_update_time>2015-09-19 06:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id="49294">  
    <host_id>2063</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR15</display_name>
    <alias>localhost</alias>
    <status_update_time>2015-09-19 09:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
</hoststatuslist>


I NEED OUTPUT
HTML
╔═════╦═════════════════╦═════════════════════╦════════════════════╗
║ ID  ║     HOST        ║   Uptime            ║Status              ║ 
╠═════╬═════════════════╬═════════════════════╬════════════════════╣
║  1  ║ ZACN-PSPR-HVR13 ║ 2015-09-19 08:00:31 ║  management_server ║
║  2  ║ ZACN-PSPR-HVR14 ║ 2015-09-19 06:00:31 ║ linux_servers      ║
║  3  ║ ZACN-PSPR-HVR15 ║ 2015-09-19 09:00:31 ║ localhost          ║
╚═════╩═════════════════╩═════════════════════╩════════════════════╝
Posted
Updated 19-Sep-15 3:25am
v5

If I understood your question correctly, you want to join the documents. If this is the case, consider the following:
C#
         string xml1 = @"<hostgroup id=""2080"">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id=""2061"">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id=""2062"">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id=""2063"">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>";

         string xml2 = @"<hoststatuslist>
 <hoststatus id=""49294"">
    <host_id>2061</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR13</display_name>
    <alias>management_servers</alias>
    <status_update_time>2015-09-19 08:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id=""49294"">
    <host_id>2062</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR14</display_name>
    <alias>linux_servers</alias>
    <status_update_time>2015-09-19 06:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id=""49294"">
    <host_id>2063</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR15</display_name>
    <alias>localhost</alias>
    <status_update_time>2015-09-19 09:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
</hoststatuslist>";

         System.Xml.Linq.XElement element1 = System.Xml.Linq.XElement.Parse(xml1);

         System.Xml.Linq.XElement element2 = System.Xml.Linq.XElement.Parse(xml2);

         var querya = from item1 in element1.Descendants("host")
                      join item2 in element2.Descendants("hoststatus")
                      on item1.Attribute("id").Value equals item2.Elements("host_id").First().Value
                      select new {
                         Host = item2.Elements("display_name").First().Value,
                         UpTime = item2.Elements("last_time_up").First().Value,
                         Alias = item2.Elements("alias").First().Value
                      };


ADDITION:

Test case for multiple hostgroups
C#
         string xml1 = @"<root>
<hostgroup id=""2080"">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id=""2061"">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id=""2062"">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id=""2063"">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>
<hostgroup id=""2081"">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id=""112"">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id=""113"">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
    </members>
</hostgroup>
<hostgroup id=""2082"">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id=""201"">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id=""202"">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id=""203"">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>
</root>";

         string xml2 = @"<hoststatuslist>
 <hoststatus id=""49294"">  
    <host_id>2061</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR13</display_name>
    <alias>management_servers</alias>
    <status_update_time>2015-09-19 08:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id=""49294"">  
    <host_id>2062</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR14</display_name>
    <alias>linux_servers</alias>
    <status_update_time>2015-09-19 06:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
<hoststatus id=""49294"">  
    <host_id>2063</host_id>
    <name>ZACN-VSPR-WAP02</name>
    <display_name>ZACN-PSPR-HVR15</display_name>
    <alias>localhost</alias>
    <status_update_time>2015-09-19 09:00:31</status_update_time>
    <last_state_change>2015-09-18 19:25:06</last_state_change>
    <last_hard_state_change>2015-09-16 18:18:04</last_hard_state_change>
    <last_time_up>2015-09-19 08:00:31</last_time_up>
    <last_time_down>2015-09-18 19:25:06</last_time_down>
  </hoststatus>
</hoststatuslist>";


         System.Xml.Linq.XElement element1 = System.Xml.Linq.XElement.Parse(xml1);
         System.Xml.Linq.XElement element2 = System.Xml.Linq.XElement.Parse(xml2);
         string id_condition = "2080";

         var query = from item1 in element1.Descendants("hostgroup").Where(x => x.Attribute("id").Value == id_condition).First().Descendants("host")
                      join item2 in element2.Descendants("hoststatus")
                      on item1.Attribute("id").Value equals item2.Elements("host_id").First().Value
                      select new {
                         Host = item2.Elements("display_name").First().Value,
                         UpTime = item2.Elements("last_time_up").First().Value,
                         Alias = item2.Elements("alias").First().Value
                      };
 
Share this answer
 
v2
Comments
Maciej Los 19-Sep-15 12:39pm    
5ed!
Wendelius 19-Sep-15 13:52pm    
Thanks Maciej
Mohamed Hasan Shali 21-Sep-15 6:30am    
I am using this code working is fine but i need with where condition.
I changed code like this but i didnot get response.
please see my code. where condition check on hostgroup id="2080"

var querya = from item1 in element1.Descendants("host")
where item1.Attribute("id").Value.ToString() == "3131"
join item2 in element2.Descendants("hoststatus")
on item1.Attribute("id").Value equals item2.Elements("host_id").First().Value
select new
{
Host = item2.Elements("display_name").First().Value,
UpTime = item2.Elements("last_time_up").First().Value,
Alias = item2.Elements("alias").First().Value
};
Wendelius 21-Sep-15 6:39am    
In order to add the condition I would need to see the whole first XML document. In your example the first XML document contains only elements inside 2080 so as far as I can see, all the members inside <hostgroup id="2080"> would be included.

Is the idea that the first XML is somehow different or have I misunderstood something?
Mohamed Hasan Shali 21-Sep-15 7:07am    
Please find my xml format below. It have difference hostgroup id="2081" suppose user select id is 2082. I need filter and compare by host id.
Try this:
C#
var result = xdoc.Descendants("hoststatus")
    .Select(x=>new
        {
            id = (int)x.Element("host_id"),
            host = (string)x.Element("display_name"),
            uptime = (DateTime)x.Element("status_update_time"),
            status = (string)x.Element("alias")
        });


Returns IEnumerable<int, string, DateTime, string> resultset:
id   host            uptime              status
2061 ZACN-PSPR-HVR13 2015-09-19 08:00:31 management_servers
2062 ZACN-PSPR-HVR14 2015-09-19 06:00:31 linux_servers2063 ZACN-PSPR-HVR15 2015-09-19 09:00:31 localhost


Note: your question is unclear... If you want to join data from both documents, you have to use members of document 1
C#
host_id = (int)x.Attribute("id")
// or/and
host_name = (string)x.Element("host_name")


To ba able to filter data, use Where condition.
 
Share this answer
 
v2
Comments
Wendelius 19-Sep-15 11:33am    
Looks like a good solution! 5.
Maciej Los 19-Sep-15 12:31pm    
Thank you, Mika.
XML
<hostgroup id="2080">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id="261">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id="262">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id="263">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>
<hostgroup id="2081">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id="112">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id="113">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>    
    </members>
</hostgroup>
<hostgroup id="2082">
    <instance_id>1</instance_id>
    <hostgroup_name>Avanade-Hypervisors</hostgroup_name>
    <members>
      <host id="201">
        <host_name>ZACN-PSPR-HVR13</host_name>
      </host>
      <host id="202">
        <host_name>ZACN-PSPR-HVR14</host_name>
      </host>
      <host id="203">
        <host_name>ZACN-PSPR-HVR15</host_name>
      </host>
    </members>
</hostgroup>
 
Share this answer
 
Comments
Mohamed Hasan Shali 22-Sep-15 2:51am    
Mika @ Thanks Its working Execellent

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900