i have a webservice (wsdl) generated from a java project. its output is getting as xml format. something like this
<?xml version="1.0" encoding="UTF-8"?><list><map><entry key="aid">160608</entry><entry key="aDate">2013-10-24 00:00:00.0 IST</entry><entry key="insuranceType">Self Pay</entry><entry key="status">New</entry><entry key="pid">160576</entry><entry key="pChartno" /><entry key="lName">Mathur</entry><entry key="fName">Gaurav</entry><entry key="mName">mathur</entry><entry key="gender">Male</entry><entry key="ssn" /><entry key="providerId">2030</entry><entry key="providerFname">lakshman</entry></map></list>
in my cs file i parse the xml and put the result in a dataset. here is my code
DataSet dsresult = new DataSet();
XmlDocument xml = new XmlDocument();
xml.LoadXml("--XML String From Webservice Here--");
XmlElement exelement = xml.DocumentElement;
XmlNodeReader nodereader = new XmlNodeReader(exelement);
dsresult.ReadXml(nodereader, XmlReadMode.Auto);
return dsresult;
now i bind the dataset to a gridview and it show only this
how can i get the key from each node ie, from <entry key="aid">
and display "aid" and other keys as table head? cs code will be helpful.
i want a grid data like this (Click here for grid image)
EDIT 1
For single row data,Sam's code is working. but when i input an xml string like this
<?xml version="1.0" encoding="UTF-8"?><list><map><entry key="aid">173661</entry><entry key="aDate">2013-10-28 00:00:00.0 IST</entry><entry key="insuranceType">Self Pay</entry><entry key="status">Serviced</entry><entry key="pid">163686</entry><entry key="pChartno" /><entry key="lName">Bec&&kwith</entry><entry key="fName">Burt</entry><entry key="mName" /><entry key="gender">Male</entry><entry key="ssn" /><entry key="providerId">137935</entry><entry key="providerFname">test</entry></map><map><entry key="aid">173675</entry><entry key="aDate">2013-10-28 00:00:00.0 IST</entry><entry key="insuranceType">Self Pay</entry><entry key="status">New</entry><entry key="pid">2038</entry><entry key="pChartno" /><entry key="lName">Velusamy </entry><entry key="fName">Anand</entry><entry key="mName">M</entry><entry key="gender">Male</entry><entry key="ssn">12345690</entry><entry key="providerId">137935</entry><entry key="providerFname">test</entry></map><map><entry key="aid">173679</entry><entry key="aDate">2013-10-28 00:00:00.0 IST</entry><entry key="insuranceType">Self Pay</entry><entry key="status">Serviced</entry><entry key="pid">140417</entry><entry key="pChartno" /><entry key="lName">alex</entry><entry key="fName">pandian</entry><entry key="mName" /><entry key="gender">Male</entry><entry key="ssn" /><entry key="providerId">137935</entry><entry key="providerFname">test</entry></map></list>
it shows this error:-"There are multiple root elements"
I tried your XML and I got this result.
You need to create new instance of StringReader
and pass your XML to it. As you DataSet
will contain key and desc columns you need to create a DataTable
to convert the rows to columns, hence the extra function.
protected void Page_Load(object sender, EventArgs e)
{
DataSet dsresult = new DataSet();
XmlDocument xml = new XmlDocument();
xml.LoadXml("<?xml version=\"1.0\" encoding=\"UTF-8\"?><list><map><entry key=\"aid\">160608</entry><entry key=\"aDate\">2013-10-24 00:00:00.0 IST</entry><entry key=\"insuranceType\">Self Pay</entry><entry key=\"status\">New</entry><entry key=\"pid\">160576</entry><entry key=\"pChartno\" /><entry key=\"lName\">Mathur</entry><entry key=\"fName\">Gaurav</entry><entry key=\"mName\">mathur</entry><entry key=\"gender\">Male</entry><entry key=\"ssn\" /><entry key=\"providerId\">2030</entry><entry key=\"providerFname\">lakshman</entry></map></list>");
XmlElement exelement = xml.DocumentElement;
dsresult.ReadXml(new XmlTextReader(new System.IO.StringReader(exelement.InnerXml)));
DataTable transposedTable = GenerateTransposedTable(dsresult.Tables[0]);
grd.DataSource = transposedTable;
grd.DataBind();
}
private DataTable GenerateTransposedTable(DataTable inputTable)
{
DataTable outputTable = new DataTable();
// Add columns by looping rows
// Header row's first column is same as in inputTable
outputTable.Columns.Add(inputTable.Columns[0].ColumnName.ToString());
// Header row's second column onwards, 'inputTable's first column taken
foreach (DataRow inRow in inputTable.Rows)
{
string newColName = inRow[0].ToString();
outputTable.Columns.Add(newColName);
}
// Add rows by looping columns
for (int rCount = 1; rCount <= inputTable.Columns.Count - 1; rCount++)
{
DataRow newRow = outputTable.NewRow();
// First column is inputTable's Header row's second column
newRow[0] = inputTable.Columns[rCount].ColumnName.ToString();
for (int cCount = 0; cCount <= inputTable.Rows.Count - 1; cCount++)
{
string colValue = inputTable.Rows[cCount][rCount].ToString();
newRow[cCount + 1] = colValue;
}
outputTable.Rows.Add(newRow);
}
return outputTable;
}
try this
Your Xml
<?xml version="1.0" encoding="UTF-8" ?>
<list>
<map>
<entry key="aid">160608</entry>
<entry key="aDate">2013-10-24 00:00:00.0 IST</entry>
<entry key="insuranceType">Self Pay</entry>
<entry key="status">New</entry>
<entry key="pid">160576</entry>
<entry key="pChartno" />
<entry key="lName">Mathur</entry>
<entry key="fName">Gaurav</entry>
<entry key="mName">mathur</entry>
<entry key="gender">Male</entry>
<entry key="ssn" />
<entry key="providerId">2030</entry>
<entry key="providerFname">lakshman</entry>
</map>
</list>
private void LoadData()
{
XDocument xDoc = XDocument.Load("E:\\test.xml");
XElement xEle = xDoc.XPathSelectElement("//map");
List<string> lstValues = new List<string>();
if (xEle != null)
{
foreach (XElement xElement in xEle.Descendants())
{
if (xElement.Attribute("key") != null)
{
lstValues.Add(xElement.Attribute("key").Value); // In this List you will get everything
}
}
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.