Быстрый и простой способ прочитать XML и сохранить его в C # Winform Applicaiton - PullRequest
0 голосов
/ 22 января 2019

Я хочу попробовать выбрать Таблицу акций, чтобы я мог просмотреть каждую Таблицу предметов ... но только в Магазине с именем Атрибута "Tiarga" ...

вот мой текущий код ...

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using System.Windows;
using System.Xml.Linq;

namespace Portal_of_Asura
{
public partial class ShopForm : Form
{
    public string ShopName;
    public string ShopKeeperName;
    public string ShopSpecies;
    public List<XmlNode> Items = new List<XmlNode>() { };
    public ShopForm(String ShopName)
    {
        InitializeComponent();

    }
    public DataSet ds = new DataSet();

    private void ShopForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        ds.WriteXml("./ReferenceXMLS/ShopList.xml");


    }

    private void ShopForm_Load_1(object sender, EventArgs e)
    {
        ds.ReadXml("./ReferenceXMLS/ShopList.xml");

            Console.WriteLine(ds.Tables["Item"].ToString());


        dataGridView1.DataSource = ds.Tables["Item"];
    }
  }
}

и вот XML

    <?xml version="1.0" encoding="utf-8" ?>
<Shops>
  <Shop name="Tiarga">
    <ShopKeeper name="Tim the Magnificent">
      <Species>imp</Species>
    </ShopKeeper>
    <Stock>
      <Item name="Dagger">
        <Price>10 copper pieces</Price>
        <Stats>10 HP</Stats>
        <Quantity>1</Quantity>
      </Item>
      <Item name="Meal">
        <Price>2 copper pieces</Price>
        <Quantity>50</Quantity>
      </Item>
      <Item name="Iron Mace">
        <Price>Free</Price>
        <Quantity>1</Quantity>
        <Stats>10 HP, +1 Fire</Stats>
      </Item>
    </Stock>
    <PriceRange>Platinum Piece</PriceRange>
  </Shop>
  <Shop name="Tiana">
    <ShopKeeper name="Tim the Magnificent">
      <Species>imp</Species>
    </ShopKeeper>
    <Stock>
      <Item name="Dagger">
        <Price>10 copper pieces</Price>
        <Stats>10 HP</Stats>
        <Quantity>1</Quantity>
      </Item>
      <Item name="Meal">
        <Price>2 copper pieces</Price>
        <Quantity>50</Quantity>
      </Item>
      <Item name="Iron Mace">
        <Price>Free</Price>
        <Quantity>1</Quantity>
        <Stats>10 HP, +1 Fire</Stats>
      </Item>
    </Stock>
    <PriceRange>Platinum Piece</PriceRange>
  </Shop>
</Shops>

пока ... я получаю

enter image description here

Который является каждым предметом ... я не хочу этого ... только один магазин ... я уверен, что есть какой-то способ, используя linq ... но я никогда раньше не использовал linq ...

1 Ответ

0 голосов
/ 22 января 2019

Если вам не нужна десериализация, которая должна это делать:

        var xml = XDocument.Load(@"C:\temp\xml.xml");
        var ds = xml.Root.Descendants("Shop")
                .Single(x => x.Attribute("name").Value == "Tiarga")
                .Descendants("Item")
                .Select(x=> new {
                    Name = x.Attribute("name").Value,
                    Price = x.Descendants("Price").FirstOrDefault()?.Value,
                    Stats = x.Descendants("Stats").FirstOrDefault()?.Value,
                    Quantity = x.Descendants("Quantity").FirstOrDefault()?.Value,
                })
                .ToList();

        dataGridView1.DataSource = ds;
...