c# - 从xml中分层获取数据

标签 c# xml datagridview

我有这个 xml:

<folders>
  <Folder>
    <Folder_name>test</Folder_name>
    <Number_of_files>2</Number_of_files>
    <File>
      <File_name>DTLite4461-0327</File_name>
      <File_size_in_bytes>14682176</File_size_in_bytes>
    </File>
    <File>
      <File_name>TeamViewer_Setup-ioh</File_name>
      <File_size_in_bytes>11057224</File_size_in_bytes>
    </File>
  </Folder>
  <Folder>
    <Folder_name>podFolder1</Folder_name>
    <Number_of_files>1</Number_of_files>
    <File>
      <File_name>npp.6.9.1.Installer</File_name>
      <File_size_in_bytes>4203840</File_size_in_bytes>
    </File>
  </Folder>
  <Folder>
    <Folder_name>podFolder2</Folder_name>
    <Number_of_files>1</Number_of_files>
    <File>
      <File_name>d-470sqe</File_name>
      <File_size_in_bytes>2582112256</File_size_in_bytes>
    </File>
  </Folder>
</folders>

我想在 GridView 中打印它,该 View 有 3 列:文件名、文件大小和父文件夹名称。

我可以从所有节点获取所有数据,但无法将文件名连接到适当的父文件夹名称和适当的大小

我尝试过这样的:

XmlDocument doc = new XmlDocument();
doc.Load(xPath);

XmlNodeList folderNodes = doc.SelectNodes(@"/folders/Folder");
int brojac = 0;

foreach (XmlNode folderNode in folderNodes)
{
    XmlNodeList fileNameNodes = doc.SelectNodes(@"/folders/Folder/File/File_name");
    XmlNodeList fileSizeNodes = doc.SelectNodes(@"/folders/Folder/File/Size");

    foreach (XmlNode fileName in fileNameNodes)
    {
        dgvXML.Rows.Add(fileName.InnerText, folderNode.InnerText, "");
    }
}

使用此代码,它可以正确打印出父文件夹名称,但每次都会获取所有文件,但我无法将其连接到文件大小。

我想在 GridView 中得到类似的东西:

> File name ----------- Parent folder name ------ File size
> DTLite4461-0327       test                      14682176
> TeamViewer_Setup-ioh  test                      11057224
> npp.6.9.1.Installer   podFolder1                4203840       
> d-470sqe              podFolder2                2582112256

执行此操作的最佳方法是什么?

最佳答案

既然你问了最好的方法来做到这一点,我建议使用 paste special功能将使您的生活变得异常轻松。

基本上,您复制 xml 示例,使用特殊粘贴创建一个类,并使用 xmlserializer 反序列化一个对象或对象数组。这一切都在 msdn 链接上得到了完美的解释。你一定会喜欢它的。

编辑,因为您遇到问题:

要反序列化,请执行以下操作:

using (XmlSerializer serializer = new XmlSerializer(typeof(folders)))
{
    StreamReader myReader = new StreamReader(path_to_xml_goes_here);
    folders foldersObject = (folders)serializer.Deserialize(myReader);
    // Do stuff with the objects here
}

XML 类:

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class folders
{

    private foldersFolder[] folderField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Folder")]
    public foldersFolder[] Folder
    {
        get
        {
            return this.folderField;
        }
        set
        {
            this.folderField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class foldersFolder
{

    private string folder_nameField;

    private byte number_of_filesField;

    private foldersFolderFile[] fileField;

    /// <remarks/>
    public string Folder_name
    {
        get
        {
            return this.folder_nameField;
        }
        set
        {
            this.folder_nameField = value;
        }
    }

    /// <remarks/>
    public byte Number_of_files
    {
        get
        {
            return this.number_of_filesField;
        }
        set
        {
            this.number_of_filesField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("File")]
    public foldersFolderFile[] File
    {
        get
        {
            return this.fileField;
        }
        set
        {
            this.fileField = value;
        }
    }
}

/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class foldersFolderFile
{

    private string file_nameField;

    private uint file_size_in_bytesField;

    /// <remarks/>
    public string File_name
    {
        get
        {
            return this.file_nameField;
        }
        set
        {
            this.file_nameField = value;
        }
    }

    /// <remarks/>
    public uint File_size_in_bytes
    {
        get
        {
            return this.file_size_in_bytesField;
        }
        set
        {
            this.file_size_in_bytesField = value;
        }
    }
}

关于c# - 从xml中分层获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38211487/

相关文章:

php - 使用开始时间和结束时间之间的时间过滤数组或 XML

java - 未调用设置 Activity onCreate()

c# - Winform C# Datagridview paint header

c# - 传递控件的正确方法是什么?

c# - 从 Dynamics CRM 4 和 2011 中的列表中排除成员

python - 如何使用 python lxml 通过 xslt 加速大型 xml 文件的转换

c# - 正则表达式不捕获

c# - 使用一个文本框和多个参数将 SQL 数据库过滤到 DataGridView

C# 列表泛型扩展方法与非泛型

c# - 从 C# 到 C++ 编码(marshal)数据类型的类型转换问题