C# 在XElement中获取值
我一直在尝试使用子体、元素和属性从我正在编写的XML文件中检索数据以保存元数据。我现在不行,这妨碍了我的工作。当我使用LINQtoXML时,我没有产生任何价值,我无法理解为什么会发生 快速查看xml文件C# 在XElement中获取值,c#,xml,linq,parsing,C#,Xml,Linq,Parsing,我一直在尝试使用子体、元素和属性从我正在编写的XML文件中检索数据以保存元数据。我现在不行,这妨碍了我的工作。当我使用LINQtoXML时,我没有产生任何价值,我无法理解为什么会发生 快速查看xml文件 <ImageMetadata> <ColorHistogram> <Bin value="45861"/> <Bin value="31989"/> </
<ImageMetadata>
<ColorHistogram>
<Bin value="45861"/>
<Bin value="31989"/>
</ColorHistogram/>
<FaceLocations>
<FacePosition Y="379" X="205"/>
<FacePosition Y="366" X="372"/>
</FaceLocations>
</ImageMetadata>
然后,在对LINQ to XML发火之后,我稍微改变了文档的结构,使其具有一个标记和一个属性。但这没有任何效果
var bins = XElement.Load(dbMetadata)
.Descendants("Bin")
.Select(e => e.Attribute("value").Value);
// which gives me : System.ArgumentException: 'Illegal characters in path.'
我的用例是,您可以从xml结构中收集以下内容:创建图像文件的元数据。这一部分在OpenCV中看起来相当稳定,这不是我的问题。也许为了获得更多关于我的问题的反馈,应该添加我用来构建XML文档的代码
计算图像数据的部分是使用F#完成的。创建xml文档的部分是使用C完成的。因此,我将创建两个GIST来共享我的代码。请记住在您的解决方案中添加Emgu OpenCV nugget包
**使用任意两个本地jpg文件来运行将生成元数据的F#代码
**如果可能的话,我想要一种使用LINQtoXML检索数据的方法。对于颜色直方图和面位置
更新1
评论中要求我在出现问题时显示xml文件的状态。你可以在下面找到它:
尝试以下操作:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication49
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
var results = doc.Descendants("ImageMetadata").Select(x => new
{
colorHistograms = x.Descendants("ColorHistogram").Select(y => new
{
bin = y.Elements("Bin").Select(z => new
{
value = (int)z.Attribute("value")
}).ToList()
}).FirstOrDefault(),
faceLocations = x.Descendants("FaceLocations").Select(y => new
{
facePosition = y.Elements("FacePosition").Select(z => new
{
X = (int)z.Attribute("X"),
Y = (int)z.Attribute("Y")
}).ToList()
}).FirstOrDefault()
}).FirstOrDefault();
}
}
}
发生错误时,
dbMetadata
的值是多少?@har07 dbMetadata的状态在元数据文件中。我已经更新了我的帖子,看起来您只显示了XML文件的一部分。如果你能提供一份工作的话,那会很有帮助的。例如,这很容易归因于根目录中的默认XML命名空间。(对于您链接到的文件,可能不是……但基本上这个问题太复杂了-一个简短的控制台应用程序将使修复变得更简单。)@KevinAvignon如果dbMetadata
包含实际的XML,那么您应该使用Parse()
而不是Load()
。后者需要包含XML文件路径的字符串。@JonSkeet再次读取时,我发现查询中存在一些问题。我将通过删除部分xml并从一开始就直接链接该文件来更新我的问题,以消除任何歧义
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
namespace ConsoleApplication49
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
static void Main(string[] args)
{
XDocument doc = XDocument.Load(FILENAME);
var results = doc.Descendants("ImageMetadata").Select(x => new
{
colorHistograms = x.Descendants("ColorHistogram").Select(y => new
{
bin = y.Elements("Bin").Select(z => new
{
value = (int)z.Attribute("value")
}).ToList()
}).FirstOrDefault(),
faceLocations = x.Descendants("FaceLocations").Select(y => new
{
facePosition = y.Elements("FacePosition").Select(z => new
{
X = (int)z.Attribute("X"),
Y = (int)z.Attribute("Y")
}).ToList()
}).FirstOrDefault()
}).FirstOrDefault();
}
}
}