C# 反序列化XML以列出<&燃气轮机;
是否可以将以下XML转换为列表C# 反序列化XML以列出<&燃气轮机;,c#,xml,list,linq,C#,Xml,List,Linq,是否可以将以下XML转换为列表 <?xml version="1.0" encoding="UTF-8"?> <DATA> <SIGNATURES> <SIGNATURE> <UTILISATEUR>John Doe</UTILISATEUR> <ACTEUR>Emetteur</ACTEUR> <D
<?xml version="1.0" encoding="UTF-8"?>
<DATA>
<SIGNATURES>
<SIGNATURE>
<UTILISATEUR>John Doe</UTILISATEUR>
<ACTEUR>Emetteur</ACTEUR>
<DATE>20160429</DATE>
</SIGNATURE>
<SIGNATURE>
<UTILISATEUR>Philippe Martin</UTILISATEUR>
<ACTEUR>Responsable Qualité Projet</ACTEUR>
<DATE>20160503</DATE>
</SIGNATURE>
</SIGNATURES>
</DATA>
无名氏
但是XML就是一个例子,我事先不知道它的结构,所以我不能创建一个具有相同结构的类。。。我在寻找一个通用的解决方案
谢谢
编辑:
我想描述一个简单的案例,我本可以改编,但事实上,目前我不使用这种XML格式。他是这样的:
<DATA>
<ELEMENTS Cle="NAME_1">
<ELEMENT>
<ELEMENT Cle="TAG_1" Valeur="John Doe"></ELEMENT>
<ELEMENT Cle="TAG_2" Valeur="6 rue du Marché"></ELEMENT>
<ELEMENT Cle="TAG_3" Valeur="Responsable marketing"></ELEMENT>
<ELEMENT Cle="TAG_N" Valeur="..."></ELEMENT>
</ELEMENT>
<ELEMENT>...</ELEMENT>
</ELEMENTS>
<ELEMENTS Cle="NAME_N">...</ELEMENTS>
</DATA>
...
...
它“尊重”了一种格式,但内容却不尽相同。我将数据提取到一些字典中:
public class Element
{
public string Valeur { get; set; }
public Dictionary<string, Dictionary<string, List<Element>>> taElements { get; set; }
public Element()
{
taElements = new Dictionary<string, Dictionary<string, List<Element>>>();
}
public void SetXML(string xml)
{
var document = XDocument.Parse(xml);
var root = document.Root;
foreach (var elements in root.Elements("ELEMENTS"))
{
var _taElement = new Dictionary<string, List<Element>>();
foreach (var element in elements.Descendants("ELEMENT"))
{
if (element.Attribute("Cle") == null) { continue; }
if (!_taElement.ContainsKey(element.Attribute("Cle").Value)) { _taElement.Add(element.Attribute("Cle").Value, new List<Element>()); }
var elem = new Element();
if (element.Attribute("Valeur") != null) { elem.Valeur = element.Attribute("Valeur").Value; }
_taElement[element.Attribute("Cle").Value].Add(elem);
if (!taElements.ContainsKey(elements.Attribute("Cle").Value)) { taElements.Add(elements.Attribute("Cle").Value, new Dictionary<string, List<Element>>()); }
taElements[elements.Attribute("Cle").Value] = _taElement;
}
}
}
}
公共类元素
{
公共字符串Valeur{get;set;}
公共字典元素{get;set;}
公共元素()
{
taElements=新字典();
}
公共void SetXML(字符串xml)
{
var document=XDocument.Parse(xml);
var root=document.root;
foreach(root.elements(“elements”)中的var元素)
{
var_taElement=新字典();
foreach(elements.substands(“element”)中的var元素)
{
如果(element.Attribute(“Cle”)==null){continue;}
if(!_taElement.ContainsKey(element.Attribute(“Cle”).Value)){u taElement.Add(element.Attribute(“Cle”).Value,new List();}
var elem=新元素();
如果(element.Attribute(“Valeur”)!=null){elem.Valeur=element.Attribute(“Valeur”).Value;}
_taElement[element.Attribute(“Cle”).Value].Add(elem);
如果(!taElements.ContainsKey(elements.Attribute(“Cle”).Value)){taElements.Add(elements.Attribute(“Cle”).Value,new Dictionary();}
taElement[元素属性(“Cle”).Value]=\u taElement;
}
}
}
}
但无法在ItemsControl中绑定字典(这是我的最终目标)。请查看XMLSerializer/反序列化以获取文档。它将把类序列化为XML,或者将XML流读入类中
static void Main(字符串[]args)
{
数据=新数据();
data.SIGNATURES=新列表();
data.SIGNATURES.Add(新签名(){ACTEUR=“”,DATE=“”,usilizateur=“”});
data.SIGNATURES.Add(新签名(){ACTEUR=“”,DATE=“”,usilizateur=“”});
XmlSerializer serializer=新的XmlSerializer(类型(数据));
使用(TextWriter=newstreamWriter(@“Xml.Xml”))
{
序列化程序。序列化(写入程序、数据);
}
XmlSerializer反序列化器=新的XmlSerializer(typeof(DATA));
TextReader=newstreamreader(@“myXml.xml”);
object obj=反序列化程序。反序列化(读取器);
数据XmlData=(数据)obj;
reader.Close();
}
公共类签名
{
公共字符串利用器{get;set;}
公共字符串ACTEUR{get;set;}
公共字符串日期{get;set;}
}
公共类数据
{
公共列表签名{get;set;}
}
您可以创建一个列表
,该列表将使用LINQ to XML处理大多数XML。您可以提取元素的名称
var xd = XDocument.Parse(doc);
var elementName = xd.FirstChild().Name.ToString().TrimEnd('S');
var ans = xd.Descendants(elementName).Select(d => d.Descendants().ToDictionary(dd => dd.Name.ToString(), dd => dd.Value)).ToList();
如果需要将ans
绑定到DataGridView
,则可以使用DataTable
使用扩展方法,可以将列表
转换为数据表
:
public static DataTable ToDataTable(this IEnumerable<IDictionary<string, string>> rows) {
var dt = new DataTable();
if (rows.Any()) {
foreach (var kv in rows.First())
dt.Columns.Add(kv.Key, typeof(String));
foreach (var r in rows)
dt.Rows.Add(r.Values.ToArray());
}
return dt;
}
在您的通用解决方案中,列表
将包含什么类型?@NetMage string only我已经从您的标题中删除了多余的标记,并且还删除了WPF
标记(您可能正在使用WPF,但这个问题与WPF无关)。这个问题没有意义。反序列化意味着将其字符串/二进制表示形式转换为对象,以便访问其属性。如果您不知道类型,就不能真正做到这一点——即使您可以动态编译一个对象,它也毫无用处,因为您的其他代码都不知道如何使用它(编译代码时该类型不存在)。如果您只想遍历XML中的字符串值,请使用。谢谢您的帮助,但我事先不知道XML的结构。所以我不能有一个签名类。XML文件总是有一个“ELEMENTS”标记,然后是“ELEMENT”节点,然后是我不知道其名称的子节点。但即使使用ToList(),它仍然是一个字典,因此不可能绑定到datagrid?@WDKyle我不记得这是您原始帖子的要求,但我添加了如何处理它。我还修改了代码以处理任何通用的“ELEMENTS”/“ELEMENT”标记。
public static DataTable ToDataTable(this IEnumerable<IDictionary<string, string>> rows) {
var dt = new DataTable();
if (rows.Any()) {
foreach (var kv in rows.First())
dt.Columns.Add(kv.Key, typeof(String));
foreach (var r in rows)
dt.Rows.Add(r.Values.ToArray());
}
return dt;
}
var dt = ans.ToDataTable();