【发布时间】:2018-10-01 21:27:42
【问题描述】:
是否可以将以下 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 中绑定字典(这是我的最终目标)。
【问题讨论】:
-
List在您的通用解决方案中包含什么类型? -
仅限@NetMage 字符串
-
您好,我已经从您的标题中删除了多余的标签,还删除了
WPF标签(您可能正在使用 WPF,但这个问题与 WPF 无关)。 -
问题没有意义。反序列化某些东西意味着获取它的字符串/二进制表示并将其变成一个对象,以便您可以访问它的属性。如果你不知道类型,你就不能真正做到——即使你可以即时编译一个对象,它也是没用的,因为你的其他代码都不知道如何使用它(类型不知道) t 在编译代码时存在)。如果您只想遍历 XML 中的字符串值,请使用 LINQ to XML。