Avatar billede jackass- Nybegynder
25. oktober 2012 - 08:19 Der er 7 kommentarer

XML som DataGridView/DataGrid source

Hej,

Nogen der kan hjælpe med det? Egentlig vil jeg kalde min webservice fra SilverLight og vise indholdet i en DataGrid, men pt tester jeg bare fra en almindelig form applikation.

XML'en ser således ud:

<string xmlns="http://myservice/"><NewDataSet><Table><TIMESTAMP>2012-10-25T07:57:45+02:00</TIMESTAMP><PCNAME>WIN7BUILD</PCNAME><APPVERSION>2.0.0.18</APPVERSION><OS>Windows 7</OS></Table>.....osv

Og jeg forsøger således:

myservice.Service iws = new myservice.Service();
string xml = iws.GetDetails();
XDocument doc = XDocument.Load(xml);

var records = from item in doc.Root.Descendants("Table")
                select new
                {
                    Timestamp = item.Attribute("TIMESTAMP").Value,
                    PcName = item.Element("PCNAME").Value,
                    AppVersion = item.Element("APPVERSION").Value,
                    OS = item.Element("OS").Value
                };
dataGridView1.DataSource = records.ToList();


Men får følgende exception: "Illegal characters in path"
Avatar billede jackass- Nybegynder
25. oktober 2012 - 08:20 #1
Nå det åd den ikke.. vi prøver lige igen med XML'en:

<NewDataSet><Table><TIMESTAMP>2012-10-25T07:57:45+02:00</TIMESTAMP><PCNAME>WIN7BUILD</PCNAME><APPVERSION>2.0.0.18</APPVERSION><OS>Windows 7</OS></Table>
Avatar billede tjens Nybegynder
25. oktober 2012 - 22:05 #2
XDocument.Load modtager ikke XML som string, men en uri som f.eks.:

XDocument doc = XDocument.Load( @".\XMLdataFile.xml" );
Avatar billede jackass- Nybegynder
26. oktober 2012 - 06:59 #3
Mkay, tak.. nu har jeg prøvet således:

XDocument xmlDoc;
using (StringReader s = new StringReader(xml))
{
    xmlDoc = XDocument.Load(s);
}

Og "MessageBox.Show(xmlDoc.ToString());" viser korrekt hele XML'en..

Hvorkan kan jeg enten bruge den som datasource til datagridview'en, eller evt loop igennem og tilføje rows? Jeg har prøvet dette, men det fejler delvist:

var records = from item in doc.Root.Descendants("Table")
                select new
                {
                    Timestamp = item.Attribute("TIMESTAMP").Value,
                    PcName = item.Element("PCNAME").Value,
                    AppVersion = item.Element("APPVERSION").Value,
                    OS = item.Element("OS").Value
                };
               
dataGridView1.Columns.Add("Timestamp", "Timestamp");
dataGridView1.Columns.Add("PcName", "PcName");
dataGridView1.Columns.Add("AppVersion", "AppVersion");
dataGridView1.Columns.Add("OS", "OS");

int RowIndex = 0;
foreach (var wd in records)
{
    dataGridView1.Rows.Add();
    DataGridViewRow Row = dataGridView1.Rows[RowIndex];
    Row.Cells["Timestamp"].Value = wd.Timestamp;
    Row.Cells["PcName"].Value = wd.PcName;
    Row.Cells["AppVersion"].Value = wd.AppVersion;
    Row.Cells["OS"].Value = wd.OS;
    RowIndex++;
}
dataGridView1.Sort(dataGridView1.Columns[0], ListSortDirection.Ascending);               
   

Det der sker er at den faktisk korrekt smider 6 rækker i datagridview men så får jeg en exception: "Sequence contains no elements - System.Collections.ListDictionaryInternal"
Avatar billede jackass- Nybegynder
26. oktober 2012 - 07:21 #4
Hmm ser ud til det går galt i "foreach (var wd in records)" for selvom jeg udkommenterer alting i den løkke får jeg stadig fejlen.. men ikke hvis jeg udkommenterer hele løkken..?!
Avatar billede arne_v Ekspert
26. oktober 2012 - 19:34 #5
Parse XML fra en web service?  Det lyder helt forkert!

Kan du ikke generere en stub via en service reference og saa faa en data struktur tilbage som umiddelbart kan bruges?
Avatar billede tjens Nybegynder
27. oktober 2012 - 21:49 #6
Hmm. Jeg kan køre dit oprindelige eksempel uden problemer som WPF:

XAML:
        <DataGrid AutoGenerateColumns="true" Name="dataGrid1" />

C#:
            XDocument doc = XDocument.Load(@".\XMLdataFile.xml");
            dataGrid1.ItemsSource = (from item in doc.Root.Descendants("Table")
                                    select new
                                    {
                                        Timestamp = item.Element("TIMESTAMP").Value,
                                        PcName = item.Element("PCNAME").Value,
                                        AppVersion = item.Element("APPVERSION").Value,
                                        OS = item.Element("OS").Value
                                    }
                          ).ToList();

Er det fordi du har skrevet attribut ved Timestamp?
Det er et element som de andre data i den XML du har vist.
Avatar billede tjens Nybegynder
27. oktober 2012 - 22:15 #7
XML:
<?xml version="1.0" encoding="utf-8" ?>
<NewDataSet>
  <Table>
    <TIMESTAMP>2012-10-25T07:57:45+02:00</TIMESTAMP>
    <PCNAME>WIN7BUILD</PCNAME>
    <APPVERSION>2.0.0.18</APPVERSION>
    <OS>Windows 7</OS>
  </Table>
</NewDataSet>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester