【问题标题】:c# call for values by linq to xmlc# 通过 linq to xml 调用值
【发布时间】:2020-11-20 12:46:44
【问题描述】:

我正在学习如何从 XML 文件中读取和检索数据。我有这样的xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="IK.xsl"?>
<IK>
    <Folders>
        <Folder>
            <name>nameA</name>
            <info>nazwa pierwsza</info>
            <komps>
               <K1 id="1">komp1</K1>
               <K1 id="2">komp2</K1>
               <K1 id="3">komp3</K1>
               <K1 id="4">komp4</K1>
               <K1 id="5">komp5</K1>
            </komps
        </Folder>
        <Folder>
            <name>nameB</name>
            <info>nazwa druga</info>
            <komps>
               <K1 id="1">komp1</K1>
               <K1 id="2">komp2</K1>
               <K1 id="3">komp3</K1>
               <K1 id="4">komp4</K1>
               <K1 id="5">komp5</K1>
            </komps
        </Folder>
        <Folder>
            <name>nameC</name>
            <info>nazwa trzecia</info>
            <komps>
               <K1 id="1">komp1</K1>
               <K1 id="2">komp2</K1>
               <K1 id="3">komp3</K1>
               <K1 id="4">komp4</K1>
               <K1 id="5">komp5</K1>
            </komps 
        </Folder>

    </Folders>
</IK>

和类

public class Foldery
{
    public Folder folder { get; set; }
}

public class Folder
{
    public string name { get; set; }
    public string info { get; set; }
    public Komps[] komps { get; set; }
        }

        public class Komps
        {
            public string K1 { get; set; }
        }
}

我想使用 linq to xml 将所有文件夹值放入一个文件夹对象列表中? 我发现的所有示例都是针对第一级节点的,我不知道如何进入更深层次的 xml 并从中检索数据。

作为另一个字符串列表的“komps”值呢?

【问题讨论】:

  • 如果您想检索更深层次的 XML 文件,您需要将其添加到您用于反序列化的类中。例如,制作一个文件夹组件,它有一个文件夹列表,文件夹列表本身有一个名称和一个信息组件。
  • @MathewHD 我纠正了我的课程

标签: c# xml linq


【解决方案1】:

XDocument 类有一个名为Descendants 的方法。它有一个重载,您可以在其中提供XName 作为元素的过滤条件。幸运的是,stringXName 之间有一个隐式转换运算符。

因此,为了将 Folder 元素检索到 List 中,您可以使用以下代码:

//Retrieve and load the xml
using var fs = File.OpenRead("Sample.xml");
var reader = new StreamReader(fs);
var rawXml = reader.ReadToEnd();

//Parse the xml
var document = XDocument.Parse(rawXml);
var folders = document.Descendants("Folder")
    .Select(element => new Folder
    {
        Name = element.Element("name")?.Value,
        Info = element.Element("info")?.Value,
    }).ToList();

更新:提供替代方案

您还可以过滤Folders 元素并询问其子节点:

document.Descendants("Folders").Elements()

【讨论】:

  • 它正在工作,但我在 xml 中只有 5 个文件夹对象,但文件夹列表有 16 个元素,其中 11 个为空。
  • 在xml的其他部分使用“Folder”时发生了什么,我的意思是这个在Folders中,如果另一个节点中还有另一个第二个节点Folder怎么办?
  • @simoNPL 我使用了问题中提供的 xml。我已经多次运行代码,folders 集合始终只包含 5 个Folder 对象实例。
  • @simoNPL 您可以使用document.Descendants("Folders").Elements() 作为替代方案。在这里,我们首先找到Folders 元素,然后我们询问它的子元素。
  • 也许是因为我剪掉了 xml 的其余部分,但在 xml 的其余部分中只有其他点头。但是在其他节点中有节点文件夹但没有节点文件夹
【解决方案2】:

我设法使用循环和 komps 获取数据


var komps = item.Descendants("Folder").Descendants("komps").Descendants("K1");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多