Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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

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解析,使用具有子子类的XML_C#_Xml_Treeview - Fatal编程技术网

C#中的XML解析,使用具有子子类的XML

C#中的XML解析,使用具有子子类的XML,c#,xml,treeview,C#,Xml,Treeview,我尝试了几个小时,但没有得到正确的结果 我有一个XML文件,看起来像 <?xml version="1.0" encoding="UTF-8"?> <ReportVariables> <Variables section="Owner"> <Variable standard="1"> <Name>Firmenname</Name> <Type>String</Type&

我尝试了几个小时,但没有得到正确的结果

我有一个XML文件,看起来像

<?xml version="1.0" encoding="UTF-8"?>
<ReportVariables>
  <Variables section="Owner">
    <Variable standard="1">
      <Name>Firmenname</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="0">
      <Name>Filiale</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="1">
      <Name>Vorname</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="1">
      <Name>Nachname</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="1">
      <Name>PLZ</Name>
      <Type>Number</Type>
    </Variable>
    <Variable standard="1">
      <Name>Ort</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="1">
      <Name>Email</Name>
      <Type>String</Type>
    </Variable>
    <Variable standard="1">
      <Name>Telefon</Name>
      <Type>String</Type>
    </Variable>
  </Variables>
  <Variables section="Customer">
    <Variable standard="1">
      <Name>Telefon</Name>
      <Type>String</Type>
    </Variable>
  </Variables>
<ReportVariables>
现在我有一个树状视图,想要一些类似的

[-]Owner
    [x]Firmenname
        String
    [ ]Filiale
        String
    [x]Vorname
        String
    //... More content
[+]Customer
如您所见,首先我想创建一个树状视图,列出上面描述的所有元素

现在我尝试了xmldocument、xdocument和。。。但是我无法获取作为expact返回的数据

其次,我希望根据variable=>standard属性选中子子子项复选框。但这不是必须的(atm)

试过这样的方法:

var nodes = (from n in xml.Descendants("ReportVariables")
                where n.Element("Variables").Attribute("section").Value == "Owner"
                select n.Element("Variables").Descendants().Elements()).ToList();
但很明显,这也不起作用

所以我有几个问题

从XML读取的最佳方式是什么?(XDocument或XmlDocument)

我的案例推荐哪一个?


如果要将xml添加到如上所述的树视图中,从xml读取的最佳方法是什么?

我可能首先创建一个包含您感兴趣的数据的类结构。比如:

public class Section
{
    public string Name { get; set; }    
    public List<Variable> Variables { get; set; }
}

public class Variable
{
    public string Name { get; set; }    
    public string Type { get; set; }    
    public bool IsStandard { get; set; }
}

然后,您可以使用它构建树状视图。请参阅演示。

这对我帮助很大。谢谢。使用递归方法。看,不,查尔斯给了我一个很好的解决方案。递归对于一个小任务来说是一个有点多的代码^^^,但是thx用于指出这一点。我不知道你在树视图中想要多少级别的标记。您的xml很容易解析到字典中,而不是创建自定义类。我发布了xml,因此标记级别应该是清晰的。:)不管怎么说,我猜有很多通往罗马的路,还有一条通向竞技场地牢。
public class Section
{
    public string Name { get; set; }    
    public List<Variable> Variables { get; set; }
}

public class Variable
{
    public string Name { get; set; }    
    public string Type { get; set; }    
    public bool IsStandard { get; set; }
}
var sections =
    from section in doc.Descendants("Variables")
    select new Section
    {
        Name = (string) section.Attribute("section"),
        Variables = section
            .Elements("Variable")
            .Select(var => new Variable
            {
                Name = (string) var.Element("Name"),
                Type = (string) var.Element("Type"),
                IsStandard = (int) var.Attribute("standard") == 1
            })
            .ToList()
    };