2012-05-07 31 views
2

我有一個從服務接收的數據集。數據以XML格式提供。我們得到一個包含所有數據的XElement對象。 XML文檔的結構非常簡單。看起來像這樣:LINQ除了用XElement查詢

<root> 
<dataPoint> 
    <id>1</id> 
    <param1>somedata</param1> 
    <param2>somedata</param2> 
</dataPoint> 
<dataPoint> 
    <id>2</id> 
    <param1>somedata</param1> 
    <param2>somedata</param2> 
</dataPoint> 
</root> 

當然,我有大量的dataPoints。我也有一個列表(列表),其中的數據點的id在GUI中顯示。我想要的是沒有顯示在GUI上的數據點,所以我只能操作這些數據點而不是整個數據集。 感謝

+2

這並不是很困難。您幾乎已經以簡單的英文給出了查詢:其中id不在GUI中顯示的id列表中的dataPoints。試一試。 – dtb

+0

喜歡_給它一個try_。 ;) –

+0

謝謝,是的,在發佈問題之前,我意識到這是我的邏輯。我的語法並不正確,因爲我以前從來沒有做過LINQ(或者C#)。我昨天發現了很多例子,但沒有一個使用XElement,我不知道如何在LINQ查詢中鑽取元素。 –

回答

2
var toDisplay = new List<string>() { "2" }; 

var xDoc = XElement.Load(.....); 
var dPoints = xDoc.Descendants("dataPoint") 
        .Where(d => !toDisplay.Contains(d.Element("id").Value)); 
var newXml = new XElement("root",dPoints).ToString(); 
+0

他希望那些不被顯示? – yamen

+0

@yamen我想是的。 –

+0

感謝你的努力。我非常感謝幫助。 –

0

下面是一個使用可變字典,給你點的字典和相應的節點的一種方法:

var xml = "<root> \r\n <dataPoint>\r\n <id>1</id>\r\n <param1>somedata</param1>\r\n <param2>so" + 
"medata</param2>\r\n </dataPoint>\r\n <dataPoint>\r\n <id>2</id>\r\n <param1>somedata" + 
"</param1>\r\n <param2>somedata</param2>\r\n </dataPoint>\r\n</root>";  

var doc = XElement.Parse(xml); 

var pointsInGui = new List<int> {1, 3, 5}; 

var dict = doc.Descendants("dataPoint").ToDictionary(e => Convert.ToInt32(e.Element("id").Value));  
foreach (var point in pointsInGui) dict.Remove(point); 

此時dict包含2 => <relevant element>