读取文件夹中的所有 xml 个文件并将它们保存在数据表中
Read all xml files in a folder and save them in a datatable
我有一个包含一堆文件的文件夹,我想读取和解析这些文件并将一些值保存到 table 中,我将把它插入到 SQL 数据库中。该文件夹看起来像这样。 C:\document\vehicles。在文件夹中我有这样的文件:
BMW.xml、Audi.xml、Volvo.xml
在每个文件中都有一堆节点,但我感兴趣的节点看起来像:
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FpcBlock Version="01">
我想将 FPC 名称和值保存到 table 中,它应该如下所示:
这应该继续下去,直到所有值都被读取,然后我想继续到下一个文件,即 Audi 并继续填写 table。
目前我根本没有设法阅读第一个文件。任何想法我应该如何继续前进?
我当前的代码:
public partial class Form1 : Form
{
XmlDocument doc = new XmlDocument();
DirectoryInfo difo = new DirectoryInfo(@"C:\Users\ahodhv\Perforce\ahodhv_RD0029717_1921\prod\delivery\q_rec\int_test\SOPS");
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
FileInfo[] Files = difo.GetFiles("*.xml");
string[] parts;
foreach (FileInfo File in Files)
{
parts = File.Name.Split('_');
boxvehicles.Items.Add(parts[0]);
doc.Load(File.DirectoryName);
XmlNode node = doc.DocumentElement.SelectSingleNode("FpcBlock Version");
string text = node.InnerText;
}
}
}
好的,首先你的xml是错误的,应该是这样的
<?xml version="1.0" encoding="utf-8"?>
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FPC Name="5" Value="B" Updated="false" />
<FPC Name="8" Value="B" Updated="false" />
<FPC Name="10" Value="B" Updated="false" />
<FPC Name="11" Value="A" Updated="false" />
<FPC Name="14" Value="Q" Updated="false" />
</FpcBlock>
然后您需要创建 C# 对象以将您的 xml 反序列化为。
[Serializable()]
[XmlRoot(ElementName = "FPC")]
public class FPC
{
[XmlAttribute(AttributeName = "Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName = "Value")]
public string Value { get; set; }
[XmlAttribute(AttributeName = "Updated")]
public string Updated { get; set; }
}
[XmlRoot(ElementName = "FpcBlock")]
public class FpcBlock
{
[XmlElement(ElementName = "FPC")]
public List<FPC> FPC { get; set; }
}
然后这样调用
static void Main(string[] args)
{
FpcBlock cars = null;
var path = @"C:\temp\car.xml";
var serializer = new XmlSerializer(typeof(FpcBlock));
var reader = new StreamReader(path);
cars = (FpcBlock)serializer.Deserialize(reader);
reader.Close();
}
我已经测试了这段代码,它的效果非常好。现在你不需要把它们放在数据表中然后放入数据库,然后你可以使用 EntityFrameWork 直接将对象插入数据库。
(还有一件事,永远不要在按钮事件中实现你的逻辑),这是一种不好的做法。
如果对您有用,请标记为答案
我有一个包含一堆文件的文件夹,我想读取和解析这些文件并将一些值保存到 table 中,我将把它插入到 SQL 数据库中。该文件夹看起来像这样。 C:\document\vehicles。在文件夹中我有这样的文件: BMW.xml、Audi.xml、Volvo.xml 在每个文件中都有一堆节点,但我感兴趣的节点看起来像:
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FpcBlock Version="01">
我想将 FPC 名称和值保存到 table 中,它应该如下所示:
这应该继续下去,直到所有值都被读取,然后我想继续到下一个文件,即 Audi 并继续填写 table。 目前我根本没有设法阅读第一个文件。任何想法我应该如何继续前进?
我当前的代码:
public partial class Form1 : Form
{
XmlDocument doc = new XmlDocument();
DirectoryInfo difo = new DirectoryInfo(@"C:\Users\ahodhv\Perforce\ahodhv_RD0029717_1921\prod\delivery\q_rec\int_test\SOPS");
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
FileInfo[] Files = difo.GetFiles("*.xml");
string[] parts;
foreach (FileInfo File in Files)
{
parts = File.Name.Split('_');
boxvehicles.Items.Add(parts[0]);
doc.Load(File.DirectoryName);
XmlNode node = doc.DocumentElement.SelectSingleNode("FpcBlock Version");
string text = node.InnerText;
}
}
}
好的,首先你的xml是错误的,应该是这样的
<?xml version="1.0" encoding="utf-8"?>
<FpcBlock Version="01">
<FPC Name="1" Value="A" Updated="false" />
<FPC Name="3" Value="B" Updated="false" />
<FPC Name="5" Value="B" Updated="false" />
<FPC Name="8" Value="B" Updated="false" />
<FPC Name="10" Value="B" Updated="false" />
<FPC Name="11" Value="A" Updated="false" />
<FPC Name="14" Value="Q" Updated="false" />
</FpcBlock>
然后您需要创建 C# 对象以将您的 xml 反序列化为。
[Serializable()]
[XmlRoot(ElementName = "FPC")]
public class FPC
{
[XmlAttribute(AttributeName = "Name")]
public string Name { get; set; }
[XmlAttribute(AttributeName = "Value")]
public string Value { get; set; }
[XmlAttribute(AttributeName = "Updated")]
public string Updated { get; set; }
}
[XmlRoot(ElementName = "FpcBlock")]
public class FpcBlock
{
[XmlElement(ElementName = "FPC")]
public List<FPC> FPC { get; set; }
}
然后这样调用
static void Main(string[] args)
{
FpcBlock cars = null;
var path = @"C:\temp\car.xml";
var serializer = new XmlSerializer(typeof(FpcBlock));
var reader = new StreamReader(path);
cars = (FpcBlock)serializer.Deserialize(reader);
reader.Close();
}
我已经测试了这段代码,它的效果非常好。现在你不需要把它们放在数据表中然后放入数据库,然后你可以使用 EntityFrameWork 直接将对象插入数据库。
(还有一件事,永远不要在按钮事件中实现你的逻辑),这是一种不好的做法。
如果对您有用,请标记为答案