C# 在XElement中获取值

C# 在XElement中获取值,c#,xml,linq,parsing,C#,Xml,Linq,Parsing,我一直在尝试使用子体、元素和属性从我正在编写的XML文件中检索数据以保存元数据。我现在不行,这妨碍了我的工作。当我使用LINQtoXML时,我没有产生任何价值,我无法理解为什么会发生 快速查看xml文件 <ImageMetadata> <ColorHistogram> <Bin value="45861"/> <Bin value="31989"/> </

我一直在尝试使用子体、元素和属性从我正在编写的XML文件中检索数据以保存元数据。我现在不行,这妨碍了我的工作。当我使用LINQtoXML时,我没有产生任何价值,我无法理解为什么会发生

快速查看xml文件

    <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();
    
    
            }
        }
    
    
    }