在XElement中获取价值

时间:2017-04-06 05:11:30

标签: c# xml linq parsing

我一直在尝试使用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.'

Getting values from xelement

我的用例你可以从xml结构中收集如下:创建图像文件的元数据。 OpenCV的那部分看起来非常可靠,这不是我的问题。也许为了获得有关我的问题的更多反馈,与添加我用于构建XML文档的代码相关。

使用F#完成计算图像数据的部分。创建xml文档的部分是使用C#完成的。因此,我将创建两个要点来共享我的代码。请记住在解决方案中添加Emgu OpenCV块包。

  1. Image Analyzer - F#
  2. XMLDocumentParser - C#
  3. **使用任意两个本地jpg文件,以便运行将生成元数据的F#代码!

    **如果可能,我想要一种使用LINQ to XML检索数据的方法。适用于ColorHistogram和FaceLocations

    UPDATE1

    我在评论中被要求在出现问题时显示xml文件的状态。你可以在下面找到它:

    Metadata file

1 个答案:

答案 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();


        }
    }


}