Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化XML以列出<&燃气轮机;_C#_Xml_List_Linq - Fatal编程技术网

C# 反序列化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转换为列表

<?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();