Quantcast
Channel: Web API
Viewing all articles
Browse latest Browse all 4850

Issue when writing XML data to a datatable / gridview

$
0
0

I have an API feed from a Web Services call with our LMS, condensed sample code is below. <a:RosterAddedUserView> is duplicated for each user that appears on the roster and <a:PartAttendanceView> is duplicated for each piece of the course schedule (Day 1, Day 2, etc.).

<applicationApi xmlns:i="http://www.w3.org/2001/XMLSchema-instance"><Validations /><status>200</status><timeStamp>2017-04-26T17:03:11+0000</timeStamp><totalRecords>1</totalRecords><data xmlns:a="www.applicationurl.com/Services"><a:SessionRosterResponseView><a:Roster><a:TotalSeat>20</a:TotalSeat><a:TotalSeatAvaliable>4</a:TotalSeatAvaliable><a:PendingUser /><a:AddedUser><a:RosterAddedUserView><a:UserId>12345</a:UserId><a:UserFullName>Smith, John</a:UserFullName><a:OUs><a:OrganizationUnitView><a:Name>EMPLOYEE</a:Name><a:TypeName>Division</a:TypeName><a:RelatedOUs i:nil="true" /></a:OrganizationUnitView></a:OUs><a:Locator>LocNum</a:Locator><a:Attendance><a:PartAttendanceView><a:PartName>FirstDay</a:PartName><a:UserAttendance>true</a:UserAttendance></a:PartAttendanceView><a:PartAttendanceView><a:PartName>SecondDay</a:PartName><a:UserAttendance>true</a:UserAttendance></a:PartAttendanceView><a:PartAttendanceView><a:PartName>LastDay</a:PartName><a:UserAttendance>false</a:UserAttendance></a:PartAttendanceView></a:Attendance><a:Score i:nil="true" /><a:Passed>true</a:Passed><a:Status>Incomplete</a:Status><a:SessionCompletionDate>4/14/2017</a:SessionCompletionDate></a:RosterAddedUserView><a:RosterAddedUserView><a:UserId>67890</a:UserId><a:UserFullName>Doe, Jane</a:UserFullName><a:OUs><a:OrganizationUnitView><a:Name>EMPLOYEE</a:Name><a:TypeName>Division</a:TypeName><a:RelatedOUs i:nil="true" /></a:OrganizationUnitView></a:OUs><a:Locator>LocNum</a:Locator><a:Attendance><a:PartAttendanceView><a:PartName>FirstDay</a:PartName><a:UserAttendance>false</a:UserAttendance></a:PartAttendanceView><a:PartAttendanceView><a:PartName>SecondDay</a:PartName><a:UserAttendance>false</a:UserAttendance></a:PartAttendanceView><a:PartAttendanceView><a:PartName>LastDay</a:PartName><a:UserAttendance>true</a:UserAttendance></a:PartAttendanceView></a:Attendance><a:Score i:nil="true" /><a:Passed>true</a:Passed><a:Status>Incomplete</a:Status><a:SessionCompletionDate>4/14/2017</a:SessionCompletionDate></a:RosterAddedUserView></a:AddedUser><a:Comments /><a:TotalPendingUsers>0</a:TotalPendingUsers><a:TotalAddedUsers>16</a:TotalAddedUsers></a:Roster><a:Result>Success</a:Result><a:Reason i:nil="true" /></a:SessionRosterResponseView></data></applicationApi>

I need to be able to generate a table view of this data including the following fields: UserID, UserFullName and attendance. I'd like the attendance to be columns with each record.

Example:

UserId

UserFullName

FirstDay

SecondDay

LastDay

12345

Smith, John

true

true

false

67890

Doe, Jane

false

false

true

I've been able to successfully pull the UserID and UserFullName, and have been able to pull in the attendance column headings based on <a:PartName>, but when I attempt to fill with the <a:UserAttendance> value I am not getting an inaccurate result. I've attempted this a few different ways, but it appears that currently I am getting the last user's attendance record for all users.

Current Results:

UserId

UserFullName

FirstDay

SecondDay

LastDay

12345

Smith, John

false

false

true

67890

Doe, Jane

false

false

true

Any help with troubleshooting the code would be much appreciated.  Below is the code I am using that is attached to a button on a Windows Form that populates a Data Grid View.  I am guessing I'm doing something out of place, but I can not figure out what the issue is with my code.

private void btnReadXML_Click(object sender, EventArgs e)
{
//Load XML Data and create Namespace Manager
XmlDocument xmldoc = new XmlDocument();
xmldoc.Load(@"Path_To_XML.xml");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable);
nsmgr.AddNamespace("a", "www.applicationurl.com/Services");

//Create data table and add UserID and UserFullName columns
DataTable dt = new DataTable();
dt.Columns.Add("UserId", typeof(string));
dt.Columns.Add("UserFullName", typeof(string));

//Populate UserID and UserFullName columns
XmlNodeList userList = xmldoc.SelectNodes("/applicationApi/data/a:SessionRosterResponseView/a:Roster/a:AddedUser/*", nsmgr);
foreach (XmlNode user in userList)
{
    DataRow dtrow = dt.NewRow();
    dtrow["UserId"] = user["a:UserId"].InnerText;
    dtrow["UserFullName"] = user["a:UserFullName"].InnerText;

    //Add PartName columns for attendance records (only checks the first occurance of RosterAddedUserView - all users will have the same Parts.)
    XmlNodeList partList = xmldoc.SelectNodes("/applicationApi/data/a:SessionRosterResponseView/a:Roster/a:AddedUser/a:RosterAddedUserView[1]/a:Attendance/*", nsmgr);
    foreach (XmlNode part in partList)
    {
        if (!dt.Columns.Contains(part["a:PartName"].InnerText;))
        {
            dt.Columns.Add(part["a:PartName"].InnerText;, typeof(string));
        }
    }

    //Populate PartName columns with User Attendance values
    XmlNodeList attendList = xmldoc.SelectNodes("/applicationApi/data/a:SessionRosterResponseView/a:Roster/a:AddedUser/a:RosterAddedUserView/a:Attendance/*", nsmgr);
    foreach (XmlNode attend in attendList)
    {
        dtrow[attend["a:PartName"].InnerText] = attend["a:UserAttendance"].InnerText;
    }

//Add the created rows to the data table
    dt.Rows.Add(dtrow);
}

//Set DataSource for dataGridView1 to the data table.
dataGridView1.DataSource = dt;
}


Viewing all articles
Browse latest Browse all 4850

Latest Images

Trending Articles



Latest Images

<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>