简体   繁体   中英

how to get id from an xml output from wsdl webservice

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"

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM