将 LINQ XML 文件的结果加载到数据网格

Posted

技术标签:

【中文标题】将 LINQ XML 文件的结果加载到数据网格【英文标题】:Load the result of LINQ XML file to datagrid 【发布时间】:2021-04-16 03:33:19 【问题描述】:

我有一个 xml 文件。我只想加载“Project1”的内容并排序到“TaskID”。

我的 XML 文件:

<?xml version="1.0" encoding="utf-8"?>
<Contents>
  <Project Project="Project1">
    <TaskV>Hello</TaskV>
    <TaskE>Goodbye</TaskE>
    <taskID>1</taskID>
  </Project>
  <Project Project="Project1">
    <TaskV>Nice to meet you</TaskV>
    <TaskE>Let's go</TaskE>
    <taskID>2</taskID>
  </Project>
  <Project Project="Project2">
    <TaskV>This is my book</TaskV>
    <TaskE>This is my pen</TaskE>
    <taskID>1</taskID>
  </Project>
  <Project Project="Project2">
    <TaskV>Look for a cat</TaskV>
    <TaskE>Near the library</TaskE>
    <taskID>2</taskID>
  </Project>
<Contents>

我的代码:

private void loaddata()
        
            XDocument doc = XDocument.Load(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + @"\result.xml");
            var query = from project in doc.Descendants("Contents")
                        where (string)project.Element("Project") == "Project1"
                        select new 
                        
                            V = project.Element("TasKV").Value,
                            E = project.Element("TaskE").Value
                        ;
          dataGrid.ItemsSource = query;
           

我的xml:

<Window x:Class="XML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:XML"
        mc:Ignorable="d"
        Title="MainWindow" Height="420" Width="1327.471">
    <Grid>
        <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="24,64,0,0" VerticalAlignment="Top" Height="300" Width="1268" ItemsSource="Binding"/>

    </Grid>
</Window>

我可以将 XML 文件中的所有数据加载到数据网格中,但是当我使用 linq 只获取数据“Project1”时,它不起作用。

任何人都可以帮助我解决这个问题。对不起,如果我的英语很糟糕。

【问题讨论】:

使用dataGrid.DataContext = query; 设置dataGrid 的数据上下文或从xaml 中移除ItemsSource="Binding" 的覆盖。 我尝试像你说的那样使用 datagGrid.DataContext=query,但它不起作用。 【参考方案1】:

几点说明:

您的 XML 文件未正确关闭。最后一个元素应该是&lt;/Contents&gt; 而不是&lt;Contents&gt;

在这一行中V = project.Element("TasKV").Value 有一个拼写错误的TaskV(k 应该是小写)。

private void loaddata() 应该是 LoadData 根据 official guidelines

解决办法:

var query = from project in doc.Root.Elements("Project")
            where project.Value == "Project1"
            select new
            
                V = project.Element("TaskV").Value,
                E = project.Element("TaskE").Value
            ;

【讨论】:

非常感谢。错误是“TaskKV”。正确的是“TaskV”。【参考方案2】:
XDocument doc = XDocument.Load(System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments) + @"\result.xml");
var query = doc.Root.Elements("Project")
                .Where(x => x.Attribute("Project").Value == "Project1")
                .Select(x => new
                
                    V = x.Element("TaskV").Value,
                    E = x.Element("TaskE").Value
                );
dataGrid.ItemsSource = query;

【讨论】:

在“... );”之后有错误。错误是“在 XML.exe 中发生‘System.NullReferenceException’类型的异常,但未在用户代码中处理”。附加信息:对象引用未设置为对象的实例。 更新:你的代码是完美的。我在代码中有拼写错误。 “TaskV”不是“TaskV”。非常感谢【参考方案3】:

使用这个:

DataSet dataSet = new DataSet();
dataSet.ReadXml(your xml file or data);
DataView dataView = new DataView(dataSet.Tables[0]);
dataGrid.ItemsSource = dataView

【讨论】:

感谢您的回复。但我只想加载“Project1”的数据。您的代码将加载所有 Project1 和 Project2...

以上是关于将 LINQ XML 文件的结果加载到数据网格的主要内容,如果未能解决你的问题,请参考以下文章

LINQ to XML - 从文件加载 XML 片段

LINQ to XML简介

Linq To Xml操作XML增删改查

将 JSON 数据加载到 ExtJs 网格中

将网格行中的数据加载到(弹出)表单中进行编辑

用于 XML 文件持久性的 LINQ to SQL 等效项