преобразование XML-документа в таблицу данных в C # - PullRequest
1 голос
/ 18 декабря 2011

Я пытаюсь прочитать простой веб-сервис (REST) ​​и заполнить раскрывающийся список в моем настольном приложении C #.Я использую .net 2.0

Ниже приведен возврат моего веб-сервиса xml

<sections type="array">
 <section>
  <name>Standing</name>
  <created-at type="datetime">2011-10-23T23:17:54+05:30</created-at>
  <updated-at type="datetime">2011-10-23T23:17:54+05:30</updated-at>
  <id type="integer">1</id>
  <status type="integer">1</status>
  <service-charge type="float">0.0</service-charge>
 </section>
 <section>
  <name>VIP</name>
  <created-at type="datetime">2011-10-30T11:27:05+05:30</created-at>
  <updated-at type="datetime">2011-10-30T11:27:05+05:30</updated-at>
  <id type="integer">2</id>
  <status type="integer">1</status>
  <service-charge type="float">10.0</service-charge>
 </section>

, и в следующем коде я пытаюсь преобразовать документ xml втаблица данных

  public DataTable getSections() {
    String url = "http://<site_url>/sections.xml";
    DataTable t = new DataTable();
    HttpHandler handle = new HttpHandler();
    StreamReader sr = handle.executeGET(url);
    String xml = "";
    while (sr.Peek() >= 0)
    {
        xml  += sr.ReadLine();
    }
    XmlDataDocument doc = new XmlDataDocument();
    doc.LoadXml(xml);
    XmlReader xmlReader = new XmlNodeReader(doc);
    DataSet ds = new DataSet();
    ds.ReadXml(xmlReader);
    t = ds.Tables[0];
    return t;
}

и в последнем сегменте я пытаюсь привязать ее к раскрывающемуся списку (cmbSections)

DataTable t = sec.getSections();
cmbSections.DataSource = t;
cmbSections.DisplayMember = "name";
cmbSections.ValueMember = "id";

Но я получаю следующую ошибку1014 *

Cannot bind to the new display member.
Parameter name: newDisplayMember

Что мне здесь не хватает, пожалуйста, помогите, я новичок в мире C #

Ответы [ 3 ]

1 голос
/ 24 июня 2013

Используйте метод расширения для поддержки преобразования XElement в Datatable. Вы можете добавить этот метод к любому из ваших служебных классов. Убедитесь, что класс статичен.

public static class XElementExtensions 
{
    public static DataTable ToDataTable(this XElement element) 
    {
        DataSet ds = new DataSet();
        string rawXml = element.ToString();
        ds.ReadXml(new StringReader(rawXml));
        return ds.Tables[0];
    }


    public static DataTable ToDataTable(this IEnumerable<XElement> elements) 
    {
        return ToDataTable(new XElement("Root", elements));
    }
}

Как использовать

//Add logic to store xml data in file or string & read accordingly here.
string file = Server.MapPath("~/Data.xml");
XDocument document = XDocument.Load(file);
var query = from b in document.Elements("sections").Elements("section")
                  select b;

DataTable table = query.ToDataTable();
1 голос
/ 10 ноября 2015

Простой способ конвертировать XML в DataSet:

        StringReader strr = new StringReader(strXML);
        XmlTextReader xtr = new XmlTextReader(strr);
        YourTypeDataSet dstest = new YourTypeDataSet();
        dstest.ReadXml(xtr);

        if (dstest.Tables.Count > 0) ...

для правильного преобразования вы заменяете свой тип DataSet вместо: DataSet dstest = new DataSet ();

;)

0 голосов
/ 19 декабря 2011

Я работал со следующим кодом, но я не уверен, если это правильный способ сделать это

(Это анализирует тот же самый xml)

public DataTable getSections() {
        String url = "http://<site_url>/sections.xml/sections.xml";
        DataTable t = new DataTable();
        t.Columns.Add("id", typeof(String));
        t.Columns.Add("name", typeof(String));

        HttpHandler handle = new HttpHandler();
        StreamReader sr = handle.executeGET(url);
        String xml = "";
        List<String> id = new List<string>();
        List<String> name = new List<string>();

        while (sr.Peek() >= 0)
        {
            xml  += sr.ReadLine();
        }
        XmlDataDocument doc = new XmlDataDocument();
        doc.LoadXml(xml);
        XmlReader xmlReader = new XmlNodeReader(doc);
        while (xmlReader.Read()){
            if (xmlReader.IsStartElement()) {
                String b = xmlReader.Name;
                switch (xmlReader.Name) { 
                    case "sections":
                        break;
                    case "section":
                        break;
                    case "id":
                        if (xmlReader.Read())
                        {
                            id.Add(xmlReader.Value.Trim());
                        }
                        break;
                    case "name":
                        if (xmlReader.Read())
                        {
                            name.Add(xmlReader.Value.Trim());

                        }
                        break;

                }
            }
        }

        int counter = 0;

        foreach (String i in id) {
            DataRow r = t.NewRow();
            r["id"] = i;
            r["name"] = name[counter];
            t.Rows.Add(r);    
            counter += 1;
        }
        return t;
    }

Спасибо за комментарии: D Ваши ценные комментарии всегда приветствуются

...