1

我有具有以下结构的 XML:

<?xml version="1.0" encoding="utf-8"?>
<produktyLecznicze stanNaDzien="2019-09-01" xmlns="http://rejestrymedyczne.csioz.gov.pl/rpl/eksport-danych-v1.0">
  <produktLeczniczy nazwaProduktu="Zoledronic acid Fresenius Kabi" rodzajPreparatu="ludzki" nazwaPowszechnieStosowana="Acidum zoledronicum" moc="4 mg/5 ml">
    <substancjeCzynne>
      <substancjaCzynna>Acidum zoledronicum</substancjaCzynna>
    </substancjeCzynne>
    <opakowania>
      <opakowanie wielkosc="1" jednostkaWielkosci="fiol. 5 ml" kodEAN="05909991023652" id="2" />
      <opakowanie wielkosc="4" jednostkaWielkosci="fiol. 5 ml" kodEAN="05909991023669" id="3" />
      <opakowanie wielkosc="10" jednostkaWielkosci="fiol. 5 ml" kodEAN="05909991023676" id="4" />
    </opakowania>
  </produktLeczniczy>
</produktyLecznicze>

我必须使用“opakowania”从“produktLeczniczy”获取数据,并将其放在 DataGridView 的同一行中。

我正在尝试代码:

private void button2_Click(object sender, EventArgs e)
        {
string FILENAME = @"h:\test_lek.xml";
            string xml = File.ReadAllText(FILENAME);
            //textBox1.Text = xml;
            XDocument doc = XDocument.Parse(xml);
            XElement root = doc.Root;
            XNamespace ns = root.Descendants().Where(x => x.Name.LocalName == "produktLeczniczy").FirstOrDefault().GetDefaultNamespace();

            List <HeaderResult> results = root.Descendants(ns + "id").Select(x => new HeaderResult()
            {
                id = (int)x.Element(ns + "id"),
                kodATC = (string)x.Element(ns + "kodATC"),
                waznoscPozwolenia = (string)x.Element(ns + "waznoscPozwolenia"),
                numerPozwolenia = (string)x.Element(ns + "numerPozwolenia"),
                typProcedury = (string)x.Element(ns + "typProcedury"),
                podmiotOdpowiedzialny = (string)x.Element(ns + "podmiotOdpowiedzialny"),
                postac = (string)x.Element(ns + "postac"),
                moc = (string)x.Element(ns + "moc"),
                nazwaPowszechnieStosowana = (string)x.Element(ns + "nazwaPowszechnieStosowana"),
                rodzajPreparatu = (string)x.Element(ns + "rodzajPreparatu"),
                nazwaProduktu = (string)x.Element(ns + "nazwaProduktu"),
                lines = x.Descendants(ns + "opakowania").Select(y => new LinesResult()
                {
                    opakowanieId = (int)y.Element(ns + "id"),
                    dystrybutorRownolegly = (string)y.Element(ns + "dystrybutorRownolegly"),
                    numerEu = (string)y.Element(ns + "numerEu"),
                    skasowane = (string)y.Element(ns + "skasowane"),
                    kategoriaDostepnosci = (string)y.Element(ns + "kategoriaDostepnosci"),
                    kodEAN = (string)y.Element(ns + "kodEAN"),
                    jednostkaWielkosci = (string)y.Element(ns + "jednostkaWielkosci"),
                    wielkosc = (string)y.Element(ns + "wielkosc"),
                }).ToList()

            }).ToList();

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(int));
            dt.Columns.Add("kodATC", typeof(string));
            dt.Columns.Add("waznoscPozwolenia", typeof(string));
            dt.Columns.Add("numerPozwolenia", typeof(string));
            dt.Columns.Add("typProcedury", typeof(string));
            dt.Columns.Add("podmiotOdpowiedzialny", typeof(string));
            dt.Columns.Add("postac", typeof(string));
            dt.Columns.Add("moc", typeof(int));
            dt.Columns.Add("nazwaPowszechnieStosowana", typeof(string));
            dt.Columns.Add("rodzajPreparatu", typeof(string));
            dt.Columns.Add("nazwaProduktu", typeof(string));
            dt.Columns.Add("opakowanieId", typeof(int));
            dt.Columns.Add("dystrybutorRownolegly", typeof(string));
            dt.Columns.Add("numerEu", typeof(string));
            dt.Columns.Add("skasowane", typeof(string));
            dt.Columns.Add("kategoriaDostepnosci", typeof(string));
            dt.Columns.Add("kodEAN", typeof(string));
            dt.Columns.Add("jednostkaWielkosci", typeof(string));
            dt.Columns.Add("wielkosc", typeof(string));

            foreach (HeaderResult result in results)
            {
                foreach (LinesResult line in result.lines)
                {
                    dt.Rows.Add(new object[] {
                        result.id,
                        result.kodATC,
                        result.waznoscPozwolenia,
                        result.numerPozwolenia,
                        result.typProcedury,
                        result.podmiotOdpowiedzialny,
                        result.postac,
                        result.moc,
                        result.nazwaPowszechnieStosowana,
                        result.rodzajPreparatu,
                        result.nazwaProduktu,
                        line.opakowanieId,
                        line.dystrybutorRownolegly,
                        line.numerEu,
                        line.skasowane,
                        line.kategoriaDostepnosci,
                        line.kodEAN,
                        line.jednostkaWielkosci,
                        line.wielkosc
                    });
                }
            }
            dataGridView1.DataSource = dt;
}

public class HeaderResult
        {
            public int id { get; set; }
            public string kodATC { get; set; }
            public string waznoscPozwolenia { get; set; }
            public string numerPozwolenia { get; set; }
            public string typProcedury { get; set; }
            public string podmiotOdpowiedzialny { get; set; }
            public string postac { get; set; }
            public string moc { get; set; }
            public string nazwaPowszechnieStosowana { get; set; }
            public string rodzajPreparatu { get; set; }
            public string nazwaProduktu { get; set; }
            public List<LinesResult> lines { get; set; }
        }
        public class LinesResult
        {
            public int opakowanieId { get; set; }
            public string dystrybutorRownolegly { get; set; }
            public string numerEu { get; set; }
            public string skasowane { get; set; }
            public string kategoriaDostepnosci { get; set; }
            public string kodEAN { get; set; }
            public string jednostkaWielkosci { get; set; }
            public string wielkosc { get; set; }
        }
  1. 在 DataGridView 我只有标题名称,没有任何行。这段代码有什么问题?
  2. 如何将 XML 中的“substancjeCzynne”添加到 DataGridView?
4

1 回答 1

1

您使用的是元素而不是属性。请参阅下面的更改

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

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        const string FILENAME = @"c:\temp\test.xml";

        public Form1()
        {
            InitializeComponent();
        }
        private void button2_Click(object sender, EventArgs e)
        {
            string xml = File.ReadAllText(FILENAME);
            //textBox1.Text = xml;
            XDocument doc = XDocument.Parse(xml);
            XElement root = doc.Root;
            XNamespace ns = root.Descendants().Where(x => x.Name.LocalName == "produktLeczniczy").FirstOrDefault().GetDefaultNamespace();

            List<HeaderResult> results = root.Descendants(ns + "produktLeczniczy").Select(x => new HeaderResult()
            {
                moc = (string)x.Attribute("moc"),
                nazwaPowszechnieStosowana = (string)x.Attribute("nazwaPowszechnieStosowana"),
                rodzajPreparatu = (string)x.Attribute("rodzajPreparatu"),
                nazwaProduktu = (string)x.Attribute("nazwaProduktu"),
                substancjaCzynna = x.Descendants(ns + "substancjaCzynna").Select(y => (string)y).ToArray(),
                lines = x.Descendants(ns + "opakowanie").Select(y => new LinesResult()
                {
                    id = (int)y.Attribute("id"),
                    kodEAN = (string)y.Attribute("kodEAN"),
                    jednostkaWielkosci = (string)y.Attribute("jednostkaWielkosci"),
                    wielkosc = (string)y.Attribute("wielkosc"),
                }).ToList()

            }).ToList();

            DataTable dt = new DataTable();
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("moc", typeof(string));
            dt.Columns.Add("nazwaPowszechnieStosowana", typeof(string));
            dt.Columns.Add("rodzajPreparatu", typeof(string));
            dt.Columns.Add("nazwaProduktu", typeof(string));
            dt.Columns.Add("substancjaCzynna", typeof(string));
            dt.Columns.Add("kodEAN", typeof(string));
            dt.Columns.Add("jednostkaWielkosci", typeof(string));
            dt.Columns.Add("wielkosc", typeof(string));

            foreach (HeaderResult result in results)
            {
                foreach (LinesResult line in result.lines)
                {
                    dt.Rows.Add(new object[] {
                        line.id,
                        result.moc,
                        result.nazwaPowszechnieStosowana,
                        result.rodzajPreparatu,
                        result.nazwaProduktu,
                        string.Join(",",result.substancjaCzynna),
                        line.kodEAN,
                        line.jednostkaWielkosci,
                        line.wielkosc
                    });
                }
            }
            dataGridView1.DataSource = dt;
        }

        public class HeaderResult
        {
            public string moc { get; set; }
            public string nazwaPowszechnieStosowana { get; set; }
            public string rodzajPreparatu { get; set; }
            public string nazwaProduktu { get; set; }
            public string[] substancjaCzynna { get; set; }
            public List<LinesResult> lines { get; set; }
        }
        public class LinesResult
        {
            public int id { get; set; }
            public string kodEAN { get; set; }
            public string jednostkaWielkosci { get; set; }
            public string wielkosc { get; set; }
        }

    }
}
于 2019-09-09T23:58:45.797 回答