Xml解析为列表
本文关键字:列表 Xml | 更新日期: 2023-09-27 18:24:01
我有一个xml文档,我需要将其解析为通用列表,甚至解析为数据表,因为我的最终目标是在网格中显示数据。我在写LINQ查询,我已经很接近了,但没能得到我想要的。XML结构:
<Datas preview="0">
<meta>
<inputOrder>
<input>IPAddress</input>
<input>name</input>
<input>rawdata</input>
</inputOrder>
</meta>
<data ID="0">
<input k="IPAddress">
<value>
<text>ipaddress</text>
</value>
</input>
<input k="name">
<value>
<text>some string</text>
</value>
</input>
<input k="rawdata">
<v xml:space="preserve" trunc="0">some data</v>
</input>
</data>
<data ID="1">
<input k="IPAddress">
<value>
<text>ipaddress</text>
</value>
</input>
<input k="name">
<value>
<text>some string</text>
</value>
</input>
<input k="rawdata">
<v xml:space="preserve" trunc="0">some data</v>
</input>
</data>
</Datas>
到目前为止我的代码:
//dataobject is my generic list
XElement xml = XElement.Load("c:''test.xml");
var mydata = (from header in xml.Elements("data").Elements("input")
select new dataobject
{
ipaddress = ??
name= ??
rawdata=??
}).ToList();
- 是否有有效的方法加载上述值
- 我最初想将的值动态加载到数据表列标题中,然后将值添加到其中,但如果有一种很好的方法可以做到这一点,甚至不必转换为列表,请告诉我
一种可能的解决方案如下:
- 创建DataObject结构
- 获取所有数据节点
- 对于每个数据节点,获取所有输入
- 读取输入字段并创建DataObject
- 将DataObject添加到列表
- 使用列表将对象添加到数据库
DataObject类:
public class DataObject
{
public String IP { get; set; }
public String Name { get; set; }
public String RawData { get; set; }
}
将文档解析为DataObject元素列表的代码(List<DataObject>
):
try
{
var result = new List<DataObject>();
// helper function to fetch node value regarding attribute name
Func<List<XElement>, String, String> getValueFromAttribute = (list, attributeName) =>
{
var r = list.FirstOrDefault(i => i.Attribute("k").Value.ToLower() == attributeName.ToLower());
return r != null ? r.Value : String.Empty;
};
var xml = XDocument.Load("d:''temp''input.xml");
// fetch all DATA nodes and iterate over every one
xml.Root.Descendants("data").ToList().ForEach(data =>
{
// fetch INPUT nodes
var inputs = data.Descendants("input").ToList();
result.Add(new DataObject
{
IP = getValueFromAttribute(inputs, "ipaddress"),
Name = getValueFromAttribute(inputs, "name"),
RawData = getValueFromAttribute(inputs, "rawdata")
});
});
result.ForEach(item =>
{
Console.WriteLine("{0} - {1} - {2}", item.IP, item.Name, item.RawData);
});
}
catch (Exception exception)
{
Console.WriteLine(exception.Message);
}
我修改了XML——每个数据节点都包含不同的值,所以使用上面的代码输入的是:
1 - A - RD A
2 - B - RD B
即使您只想将值直接添加到数据库中,DataObject类(对应于列表)也将帮助您轻松地传输值(提取并放入数据库)。
示例的输入xml:
<?xml version="1.0" encoding="utf-8"?>
<Datas preview="0">
<meta>
<inputOrder>
<input>IPAddress</input>
<input>name</input>
<input>rawdata</input>
</inputOrder>
</meta>
<data ID="0">
<input k="IPAddress">
<value>
<text>1</text>
</value>
</input>
<input k="name">
<value>
<text>A</text>
</value>
</input>
<input k="rawdata">
<v xml:space="preserve" trunc="0">RD A</v>
</input>
</data>
<data ID="1">
<input k="IPAddress">
<value>
<text>2</text>
</value>
</input>
<input k="name">
<value>
<text>B</text>
</value>
</input>
<input k="rawdata">
<v xml:space="preserve" trunc="0">RD B</v>
</input>
</data>
</Datas>
在data
的集合中嵌套input
的集合可能会遇到问题。
嵌套的数据不应在循环中,而应用作可查询的XElement,用于查询属性名称和值。
所以类似于:
xml.Elements("data").Select(data =>
new dataobject {
ipaddress = data.FirstOrDefault(el => el.Attribute("k") != null &&
el.Attribute("k").Value == "IPAddress");
使用其他请求的字段、漂亮的默认值和ToList()
来完成此操作。