0

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

Image of grid view here

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&amp;&amp;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"

4

2 回答 2

0

尝试这个

你的 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
                }
            }
        }
    }
于 2013-10-30T12:25:03.800 回答
0

我尝试了你的 XML,我得到了这个结果。

在此处输入图像描述

您需要创建新的实例StringReader并将您的 XML 传递给它。由于您DataSet将包含 key 和 desc 列,因此您需要创建一个DataTable以将行转换为列,因此需要额外的功能。

 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;
        }
于 2013-10-30T12:19:33.420 回答