Vinnaren i pepparkakshustävlingen!
2017-06-21, 21:18
  #1
Medlem
Hejsan behöver hjälp med hur jag ska skapa objekt från en xml fil.

Så här ser xml innehållet ut:
Kod:
<catalog>
   <
book id="B1">
      <
author>Bent the wild pork</author>
      <
title>Pigg misses the pork</title>
      <
genre>Computer</genre>
      <
price>33.00</price>
      <
publish_date>2012-08-15</publish_date>
      <
description>Cannabalismdon not trust a pig</description>
   </
book>
   <
book id="B2">
      <
author>KingKong</author>
      <
title>My life as a pimp</title>
      <
genre>Fantasy</genre>
      <
price>5.95</price>
      <
publish_date>2000-12-16</publish_date>
      <
description>Monkey revolution</description>
   </
book

Hur kan jag på smidigaste sätten skapa objekt från denna xml fil. Tanken är att jag ska skapa en List<book> av objeken book. Sedan skapa metoder för hämta information om dessa böcker. Vet inte om jag tänker rätt? Funderar just nu i brist på kunskap inom detta område ifall det räcker med en xml fil för att skapa en webservice och i så fall bara anropa till den? Någon som är villig att antigen hjälpa mig att tänka rätt eller hänvisa mig till nyttig information.
Citera
2017-06-21, 23:32
  #2
Medlem
kodsnickrarns avatar
Bra tråd på so:
https://stackoverflow.com/questions/...-xml-to-object

/K
Citera
2017-06-22, 07:55
  #3
Medlem
Danke!
Citera
2017-06-22, 14:58
  #4
Medlem
Följde denna tutorial:

https://msdn.microsoft.com/en-us/lib....aspx#Anchor_4

Men vid utskrift så skrivs inga värden ut?
Xml filens väg är fixat så att den peckar på en xml fil som jag skapat.
Vad är det som är fel?
Den dezialiserar men det är värdena som inte läggs till...
Någon som skulle kunna kika på vad det kan bero på.


Så här ser min kod ut. Testat att få den att skriva ut något men det funkar inte :/

Kod:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Serialization;

namespace 
MSTest
{
    
// This is the class that will be deserialized.
    
public class OrderedItem
    
{
        public 
string ItemName getset; }
        public 
string Description getset; }
        public 
decimal UnitPrice getset; }
        public 
int Quantity getset; }
        public 
decimal LineTotal getset; }

        
// A custom method used to calculate price per item.
        
public void Calculate()
        {
            
LineTotal UnitPrice Quantity;
        }
    }
    public class 
Test
    
{
        public static 
void Main(string[] args)
        {
            
Test t = new Test();
            
// Read a purchase order.
            
t.DeserializeObject("C:\\Users\\jKingKong\\Desktop\\simple.xml");
        }

        private 
void DeserializeObject(string filename)
        {
            
Console.WriteLine("Reading with XmlReader");

            
// Create an instance of the XmlSerializer specifying type and namespace.
            
XmlSerializer serializer = new
            
XmlSerializer(typeof(OrderedItem));

            
// A FileStream is needed to read the XML document.
            
FileStream fs = new FileStream(filenameFileMode.Open);
            
XmlReader reader XmlReader.Create(fs);

            
// Declare an object variable of the type to be deserialized.
            
OrderedItem i;

            
// Use the Deserialize method to restore the object's state.
            
= (OrderedItem)serializer.Deserialize(reader);
            
fs.Close();

            
// Write out the properties of the object.
            
Console.Write(
            
i.ItemName "\t" +
            
i.Description "\t" +
            
i.UnitPrice "\t" +
            
i.Quantity "\t" +
            
i.LineTotal);

            
Console.ReadKey();

        }
    }

__________________
Senast redigerad av Poopo 2017-06-22 kl. 15:24.
Citera
2017-06-22, 16:18
  #5
Medlem
Sane?s avatar
Det är bra att lära sig deserialisering på korrekt sätt.
I ditt fall rör det sig dock om så enkel struktur att det är enklare att göra på detta sätt:
Kod:
var doc = XDocument.Load("XXX");
var books = doc.Root
    .Elements("book")
    .Select(x => new
    {
        id = x.Attribute("id").Value,
        author = x.Element("author").Value,
        title = x.Element("author").Value,
        // osv
    })
    .ToArray();
Citera
2017-06-22, 20:47
  #6
Medlem
Citat:
Ursprungligen postat av Sane?
Det är bra att lära sig deserialisering på korrekt sätt.
I ditt fall rör det sig dock om så enkel struktur att det är enklare att göra på detta sätt:
Kod:
var doc = XDocument.Load("XXX");
var books = doc.Root
    .Elements("book")
    .Select(x => new
    {
        id = x.Attribute("id").Value,
        author = x.Element("author").Value,
        title = x.Element("author").Value,
        // osv
    })
    .ToArray();


Har skrivit koden så som du skriver här. Skrev den i en metod så att jag kan kalla på den när jag ska hämta en list med böcker. Men jag försöker skriver koden så att den returnerar en List<Book> men det går inte?
Citera
2017-06-22, 23:02
  #7
Medlem
tj.s avatar
Citat:
Ursprungligen postat av Poopo
Har skrivit koden så som du skriver här. Skrev den i en metod så att jag kan kalla på den när jag ska hämta en list med böcker. Men jag försöker skriver koden så att den returnerar en List<Book> men det går inte?
Vad får du för fel? Den selecten kommer skapa upp en anonym typ så som den är skriven nu. Vill du tilldela värdena till en Book-klass - vilket jag antar att din metod ska returnera - får du skriva .Select(x => new Book { ... }
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback