2017-04-06 59 views
0

我一直想永遠使用後代,元素和屬性來檢索XML文件,我正在寫保存元數據的數據值。我目前無法阻止我的工作。當我將Linq用於XML時,我沒有產生任何價值,我也無法解釋爲什麼會發生。獲取裏面的XElement

快速查看到的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:

//Yielding no results 

    from elements in doc.Descendants() 
    let element = elements.Element("BinValue") 
    select (long)element; 

然後惹毛了在LINQ到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塊體包。

  1. Image Analyzer - F#
  2. XMLDocumentParser - C#

**使用任何兩個地方的JPG文件,以運行F#代碼,將生成的元數據!

**如果可能的話,我想一個方法來檢索使用LINQ to XML數據。對於這兩種ColorHistogram和FaceLocations

UPDATE1

有人問我的意見,看看我的問題發生時的XML文件的狀態。您可以在下面找到它:

Metadata file

+1

什麼'dbMetadata'的值發生錯誤時? – har07

+0

@ har07 dbMetadata的狀態位於Metadata文件中。我做了一個更新我的帖子 –

+1

它看起來像你只所示的XML文件的一部分。如果你提供[mcve],這將會有所幫助。這可能很容易歸因於根中的默認XML名稱空間。 (文件你聯繫,也許不是......但基本上有一個在這個問題太混亂 - 一個短的控制檯應用程序將使這更簡單的解決。)如果'dbMetadata'包含實際的XML –

回答

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


     } 
    } 


}