是否可以将以下XML转换为List?
<?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;
}
}
}
}
但是不可能在ItemsControl中绑定字典(这是我的最终目标)。
答案 0 :(得分:1)
查看 XMLSerializer / Deserialize 以获得文档。它将把一个类序列化为XML,或将XML流读入一个类。 XML Serialization
static void Main(string[] args)
{
DATA data = new DATA();
data.SIGNATURES = new List<SIGNATURE>();
data.SIGNATURES.Add(new SIGNATURE() { ACTEUR = "", DATE= "", UTILISATEUR= "" });
data.SIGNATURES.Add(new SIGNATURE() { ACTEUR = "", DATE = "", UTILISATEUR = "" });
XmlSerializer serializer = new XmlSerializer(typeof(DATA));
using (TextWriter writer = new StreamWriter(@"Xml.xml"))
{
serializer.Serialize(writer, data);
}
XmlSerializer deserializer = new XmlSerializer(typeof(DATA));
TextReader reader = new StreamReader(@"myXml.xml");
object obj = deserializer.Deserialize(reader);
DATA XmlData = (DATA)obj;
reader.Close();
}
public class SIGNATURE
{
public string UTILISATEUR { get; set; }
public string ACTEUR { get; set; }
public string DATE { get; set; }
}
public class DATA
{
public List<SIGNATURE> SIGNATURES { get; set; }
}
答案 1 :(得分:0)
您可以创建一个List<Dictionary<string,string>>
,它将使用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
。
使用扩展方法,您可以将List<Dictionary>
转换为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;
}
现在您可以为DataTable
创建一个DataSource
:
var dt = ans.ToDataTable();