2016-12-28 5 views
0

Привет, у меня есть более 20 ссылок xml-файлов. Я много искал для преобразования моего xml в C#, а затем десериализую его по классам, а затем помещал в базу данных, но не нашел для этого хорошего решения. Пожалуйста, помогите мне, как это сделать.Преобразование XML в классы (десериализация) и сохранение его в базе данных

http://kithnyc.com/sitemap_products_1.xml?from=60594372&to=9586327751

Это ссылка базы данных и некоторые XML ниже

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> 
<url> 
<loc>http://kithnyc.com/</loc> 
<changefreq>daily</changefreq> 
</url> 
<url> 
<loc> 
http://kithnyc.com/products/adidas-originals-nmd-city-sock-black-blue 
</loc> 
<lastmod>2016-09-12T11:04:04-04:00</lastmod> 
<changefreq>daily</changefreq> 
<image:image> 
<image:loc>...</image:loc> 
<image:title>adidas Originals NMD City Sock - Black/Blue</image:title> 
</image:image> 
</url> 
<url> 
<loc> 
http://kithnyc.com/products/kith-logo-mousepad-white 
</loc> 
<lastmod>2016-12-23T00:01:41-05:00</lastmod> 
<changefreq>daily</changefreq> 
<image:image> 
<image:loc> 
https://cdn.shopify.com/s/files/1/0094/2252/products/20150810-_MG_2963.jpg?v=1482353363 
</image:loc> 
<image:title>Kith Logo Mousepad - White</image:title> 
</image:image> 
</url> 
</urlset> 

Это XML я хочу поставить все свои узлы в базе данных, как «Лок», «LastMod» и «changefreq» и ​​т. д. Пожалуйста, помогите мне, как преобразовать его в классы, а затем как десериализировать его. Благодаря

+0

Посмотрите http://stackoverflow.com/a/19612238/87956 для преобразования XML в класс, а затем использовать нормальные сериализации/deserilization для сохранения и retrive в качестве объекта из базы данных. Кроме того, поскольку вы компилируете в cs, что означает, что у вас есть конкретная структура, вы можете подумать о создании отдельной таблицы для xml, о которой идет речь. –

ответ

0

Привет вы можете сделать это следующим образом:

Шаг 1: Прочитайте файл по следующей строке

XDocument xdoc = XDocument.Load(filebyte); 

Шаг 2: получить все узел XML с помощью метода Descendants и превратить его в список. , если необходимо применить предложение where для фильтрации этих данных.

var pNodelist = xdoc.Root.Descendants().ToList().Where(i => i.Name.LocalName == "p"); 

Шаг 3: Создание таблицы данных и хранить все данные в таблице данных из списка, как

DataTable dt = new DataTable(); 
dt.Columns.Add("StartTime"); 
dt.Columns.Add("EndTime"); 
dt.Columns.Add("Message"); 
foreach (var data in pNodelist) 
{ 
if (data.HasAttributes == true) 
dt.Rows.Add(data.FirstAttribute.Value, data.LastAttribute.Value, data.Value); 
} 

Шаг 4: После этого вы можете сохранить его БД, и вы можете избежать шага 4 и непосредственно хранить дата из списка в базу данных

+0

Anurag можете ли вы рассказать о том, что такое «P» здесь i.Name.LocalName == «p»); –

+0

@Arslan Ahmad p - это теги абзацев в моем Xml, так как я хочу, чтобы все теги p –

+0

@ArslanAhmad использовали простые потомки(), чтобы получить все узлы. –

0

В коде можно добавить следующие классы данных и класс репозитория. Вы можете просто вызвать класс репозитория с пулом файлов и вызвать его метод FindAll. Он возвращает список Url.

public class Url 
{ 
    public string Loc { get; set; } 
    public string Changefreq { get; set; } 
    public string Lastmod { get; set; } 
    public Image Image { get; set; } 

} 
public class Image 
{ 
    public string Loc { get; set; } 
    public string Title { get; set; } 
} 
    public class Repository 
{ 
    private XDocument xmlDatas; 
    public Repository(string filePath) 
    { 
     xmlDatas = XDocument.Load(filePath); 
    } 
    public List<Url> FindAll() 
    { 
     return xmlDatas.Elements().Elements() 
      .Select(url => 
      { 
       Url data = new Url(); 
       foreach (var item in url.Elements()) 
       { 
        switch (item.Name.LocalName) 
        { 
         case "loc": 
          data.Loc = item.Value; 
          break; 
         case "changefreq": 
          data.Changefreq = item.Value; 
          break; 
         case "lastmod": 
          data.Lastmod = item.Value; 
          break; 
         case "image": 
          Image image = new Image(); 
          foreach (var img in item.Elements()) 
          { 
           switch (img.Name.LocalName) 
           { 
            case "loc": 
             image.Loc = img.Value; 
             break; 
            case "title": 
             image.Title = image.Title; 
             break; 
           } 
          } 
          data.Image = image; 
          break; 
        } 
        var s = item.Name.LocalName; 
       } 
       return data; 
      }).ToList(); 
    } 
} 
+0

Я проверил, что функция Findall() не возвращает ничего, проверьте, что Repository a = новый репозиторий («http: // kithnyc. ? ком/sitemap_products_1.xml от = 60594372 & к = 9586327751"); Список s = a.FindAll(); –

+0

Я изменил класс репозитория. Теперь это нормально – Mehmet

+0

Большое спасибо Мехмет. Вы гений. Спасибо за вашу любезную помощь. –