【问题标题】:Reading Multi Level XML File读取多级 XML 文件
【发布时间】:2021-06-07 09:03:01
【问题描述】:

我有一个 XML 文件,其中包含有关航行的所有信息和所有详细信息。

我想读取XML文件中的所有记录,合并记录后我想将它写入SQL数据库。

到目前为止,我安排将 header 、 company 和 voyage 放入数组,但将所有记录的详细信息放入数组中我失败了。

这是我要处理的任务:

  • 通过 FileDialog 选择并读取任何 XML 数据到 RAM(已完成)
  • 创建数组并将 XML 数据读取到数组(部分完成)
  • 将 XML 数据写入 DataView(部分完成)
  • 创建 T-SQL INSERT 命令(部分完成)
  • 将数据写入数据库(等待完成早期步骤)

从 XML 读取到 DataView 时,我可以将数据存入内存,但无法按要求分离多级数据。

确切的问题是尝试在我收到的每个 XML 文件中处理不同级别的 XML 数据。

foreach (var child in childElem.Elements("ManifestData"))
            {
                foreach(var x in child.Elements())
                {
                    var checkName = x.Name.ToString();

                    switch (checkName)
                    {
                        case "Company":
                            Globals.Companys.Clear();
                            foreach (var y in x.Elements())
                            {
                                Globals.Companys.Add(y.Name.ToString(), y.Value.ToString());
                            }
                            break;
                        case "Voyage":
                            Globals.Voyages.Clear();
                            foreach (var y in x.Elements())
                            {
                                Globals.Voyages.Add(y.Name.ToString(), y.Value.ToString());
                            }
                            break;
                        case "BLs":
                            int recs = 0;

                            Globals.BL.Clear();
                            textBox2.Clear();

                            foreach (var y in x.Elements())
                            {
                                
                                
                                   foreach (var z in x.Elements("units"))
                                   {
                                       Globals.Units.Add(y.Element("number").Value.ToString(), z.Value.ToString());

                                   }

                                Globals.BL.Add(y.Element("number").Value.ToString(), y.Value.ToString());

                                recs = recs + 1;
                                textBox2.AppendText("\n" + y.ToString());


                                string output = string.Join("\n", Globals.BL);
                                MessageBox.Show(output);
                                

                            }
                            break;
                        default:
                            break;
                    }
                }
            }

在我的示例 XML 中,您看到有 3 个 BL,所有 BL 数据都有不同的级别。可能有数百个 BL,具有不同级别的货物和危险品。

我在这里处理多级 XML 数据时遇到问题。

如果你能帮我解决这个非常基本的问题,我会很高兴。我希望学习并留给人们了解如何为自己的数据库制作桌面 XML 阅读器应用程序。

这是XML Data 示例 您可以在这里找到所有来源:Project Reading XMLbyC#

【问题讨论】:

  • 请提供Minimal, Reproducible Example,而不是您的整个代码库。这里没有人会扫描您的整个代码以查找错误,您必须提供您的尝试以及具体您遇到的问题。
  • " 将任何 XML 数据读取到 RAM" 请向我们展示此代码。查看您的 XML 后,它似乎可以由类结构表示。然后你需要它的唯一代码described here 其余的是从你的表示类访问变量并分发它们。
  • 我修复了我的帖子,我应该注意到你的观点。

标签: c# sql xml linq


【解决方案1】:

xml 处理部分可以通过将 xml 反序列化为 c# 类来简化,然后您可以使用这些类来做任何您想做的事情。

[XmlRoot(ElementName = "ManifestMessage")]
public class ManifestMessage
{
    [XmlElement(ElementName = "Header")] 
    public Header Header { get; set; }

    [XmlElement(ElementName = "ManifestData")]
    public ManifestData ManifestData { get; set; }
}

[XmlRoot(ElementName = "Header")]
public class Header
{
    [XmlElement(ElementName = "sender")]
    public string Sender { get; set; }
    [XmlElement(ElementName = "reciever")] 
    public string Reciever { get; set; }

    [XmlElement(ElementName = "timeOfDocument")]
    public string TimeOfDocument { get; set; }

    [XmlElement(ElementName = "typeOfMessage")]
    public string TypeOfMessage { get; set; }
}


// Then when you want to get the xml deserialized into your class hierarchy


var xmlSerializer = new XmlSerializer(typeof(ManifestMessage));
var manifestMessage = xmlSerializer.Deserialize(data) as ManifestMessage;

// now you can use this object to drill down the whole hierarchy

Console.WriteLine(xmlData.Header.Sender);
Console.WriteLine(xmlData.ManifestData.Company.ComanyName);
Console.WriteLine(xmlData.ManifestData.Voyage.CrewNumber);
foreach (var bl in xmlData.ManifestData.BLs.BL)
{
    Console.WriteLine(bl.Collect);
    Console.WriteLine(bl.Consegnee.Name);
    Console.WriteLine(bl.Customer.Name);
}

您可以使用https://xmltocsharp.azurewebsites.net/ 站点从您的 xml 生成整个 c# 类层次结构。

Console.WriteLine 仅用于演示目的,您可以根据需要采用它。

【讨论】:

  • 感谢您的链接!非常非常有用!投赞成票
  • 感谢链接和代码,我会检查并尝试调整我的代码,但我试图弄清楚如果 xml 发生变化如何处理(可以在 BLs 中看到它们不同记录级别)。在我的示例中,它是货物和危险品。
  • 您可以将 BLs 子项的所有不同组合添加到您的 xml 文件中,并让生成器为所有类生成类,但是您必须通过属性调整 xml 以使某些内容成为可选(如果它们是可选的)并不总是存在,例如[XmlRoot(ElementName = "AnotherBLChild", IsNullable = true)]
  • 所以这是创建所有可能组合的最佳方式,当没有数据时,只需将 null 发送到数据库是一种选择;视野开阔。谢谢你的想法。
  • @melic 如果这回答了您的问题,请您标记答案。
猜你喜欢
  • 1970-01-01
  • 2014-06-16
  • 2019-03-09
  • 1970-01-01
  • 2019-11-19
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
相关资源
最近更新 更多