将 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 文件未正确关闭。最后一个元素应该是</Contents>
而不是<Contents>
在这一行中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 文件的结果加载到数据网格的主要内容,如果未能解决你的问题,请参考以下文章