我一直在尝试使用Descendants,Elements和attributes从我正在编写的XML文件中检索数据以保存元数据。我现在不能阻止我的工作。当我使用Linq进行XML时,我没有任何价值,我无法理解为什么会这样。
快速查看xml文件
<ImageMetadata>
<ColorHistogram>
<Bin value="45861"/>
<Bin value="31989"/>
</ColorHistogram/>
<FaceLocations>
<FacePosition Y="379" X="205"/>
<FacePosition Y="366" X="372"/>
</FaceLocations>
</ImageMetadata>
我尝试过不同的解决方案。起初,我只有一个名为BinValue的XElement而不是标签Bin,其属性值导致此代码:
//Yielding no results
from elements in doc.Descendants()
let element = elements.Element("BinValue")
select (long)element;
然后在对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#完成的。因此,我将创建两个要点来共享我的代码。请记住在解决方案中添加Emgu OpenCV块包。
**使用任意两个本地jpg文件,以便运行将生成元数据的F#代码!
**如果可能,我想要一种使用LINQ to XML检索数据的方法。适用于ColorHistogram和FaceLocations
UPDATE1
我在评论中被要求在出现问题时显示xml文件的状态。你可以在下面找到它:
答案 0 :(得分:1)
请尝试以下操作:
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();
}
}
}