C# 如何从XML元素创建点对象

C# 如何从XML元素创建点对象,c#,xml,linq-to-xml,C#,Xml,Linq To Xml,我有一个应用程序,它需要保存对象的x、y坐标的功能,以便在以后再次启动应用程序时,应用程序可以搜索以前找到的点以获取图像 我已经成功地创建了一种方法,用应用程序找到的点编写XML文档(我认为格式正确)。现在我只需要在启动时将这些点从XML文件读回点对象 我发现了几个“如何”从文件中读取XML的示例,或者类似问题的答案,但无论出于何种原因,我都无法将这些答案应用于这种情况。我感兴趣的是如何从xml中提取date元素并创建datatime对象,以及如何在每个location元素中提取x元素和y元素并

我有一个应用程序,它需要保存对象的x、y坐标的功能,以便在以后再次启动应用程序时,应用程序可以搜索以前找到的点以获取图像

我已经成功地创建了一种方法,用应用程序找到的点编写XML文档(我认为格式正确)。现在我只需要在启动时将这些点从XML文件读回点对象

我发现了几个“如何”从文件中读取XML的示例,或者类似问题的答案,但无论出于何种原因,我都无法将这些答案应用于这种情况。我感兴趣的是如何从xml中提取date元素并创建datatime对象,以及如何在每个location元素中提取x元素和y元素并将它们放入一个新的点中,然后我可以使用它们

这就是我的XML文档的外观:

<?xml version="1.0" encoding="utf-8"?>
<FirstLookGameBox_XML>
  <location>
    <date>2014-10-15T00:00:00-06:00</date>
    <x>0</x>
    <y>0</y>
  </location>
  <location>
    <date>2014-10-15T00:00:00-05:00</date>
    <x>0</x>
    <y>0</y>
  </location>
  <location>
    <date>2014-10-15T00:00:00-04:00</date>
    <x>0</x>
    <y>0</y>
  </location>
</FirstLookGameBox_XML>
我还想知道我格式化XML文档的方式是否正确? 我的目标是找到图像的最后已知位置,但只存储最后3个已知位置。如果找到第四个位置,我将用最新的最后一个已知位置替换最旧的最后一个已知位置


希望我已经提供了足够的信息来说明这一点。

等等,您是否希望下面代码段中声明的x和y有任何值

var xml = XDocument.Load("test.xml");
string date;
int? x;
int? y;
实际上,您并没有将它们设置为任何值,如果设置为,则没有任何意义,因为XML中有许多
x
s和
y
s。如果要访问实际存储的x和y,请执行此操作

foreach (var obj in q)
{
    Console.WriteLine(obj.x);  // or however you want to see your input
    Console.WriteLine(obj.y);
}

即使你的代码不起作用,发布它也是有价值的——这样我们就不会给你你已经尝试过的建议。好吧,等一下,我把它放在这里。你最好告诉我们你实际上得到了什么行为。有人说,我已经有一段时间没有使用linq到xml了,但我非常确定
b.Element(“y”)
返回一个
XElement
对象,而不是您的值。我想你想要
b.Element(“y”).Value
或者类似的东西。我得到的只是空值。我对从XML中提取数据一无所知,在大多数情况下,我在网络上遇到的答案都没有解释他们为什么这么做,他们只是抛出代码片段,所以我尝试了数百次,但始终没有找到解决办法。:)我的x变量仍然是空值。假设我将x=(int?)b.Element(“x”)替换为x=int.Parse(b.Element(“x”).Value)。LINQ查询返回的是匿名类型的集合-它不会将
x
设置为任何值。您需要遍历返回的集合,并检查集合中每个对象的
日期
x
y
属性。@Fama_Sicura您的输出是什么样子的?
(int?)b.Element(“x”)
是合法的-它会导致显式转换为
可空的
。转换在返回之前调用
.Value
属性。无论我在这里做什么,我的变量都不会被linq表达式更改。当它通过这个过程时,什么也不会发生。我不太在乎如何从XML中获取值,也不在乎通过什么方式获取值。。。我只想做这件事。。这是我不想放下我的C代码的原因之一,因为我认为每个人都会专注于如何修复我所拥有的,而不仅仅是给出一个如何修复的例子。我的主要目标是了解如何做到这一点,以便我可以在我的应用程序中实现这个想法,并在将来继续改进它。
foreach (var obj in q)
{
    Console.WriteLine(obj.x);  // or however you want to see your input
    Console.WriteLine(obj.y);
}