2015-12-15 56 views
0

我有以下列表如何從xml使用linq和xpath從字符串列表中提取值?

List<string> vehicles = new List<string> {"Year", "Make", "Model" }; 

,我來自一個巨大的XML使用

var vehicle = xdoc.XPathSelectElements("s0:Transport/s0:Vehicles/s0:Vehicle[s0:Insured='Y']", namespaceManager).ToList(); 

取出一個節點<Vehicle>我試圖從車節點獲得一年,品牌和型號:

var vehicleList = vehicle.Where(x => vehicles.Contains(x.Name.LocalName)).ToList(); 

但它正在返回null的值爲vehicleList。任何人都可以請糾正我的查詢?

XML示例是

<Transport> 
..... 
<Vehicles> 
     <Vehicle> 
     <Insured>Y</Insured> 
     <Number>1</Number> 
     <Year>1997</Year> 
     <ComprehensiveSymbol /> 
     <Make>FORD</Make> 
     <Model>F-250 HEAVY DUTY</Model> 
     <BodyStyle>PICKUP</BodyStyle> 
     <VehicleType>C</VehicleType> 
     <UseType> 
      <V4Code i:nil="true" /> 
      <SourceCode>1</SourceCode> 
      ----- 

    </Vehicle> 
</Vehicles> 

--- 
-- 
</Transport> 
+0

你能展示一些你的XML的例子嗎?沒有這一點,不可能提供幫助。 –

+1

與[上一個問題](http://stackoverflow.com/q/34272851/1987598)中的問題相同:請包括[最小,**完整**和可驗證](http://stackoverflow.com/幫助/ mcve)輸入XML文檔的樣本。不要將此文檔添加爲評論,而是編輯您的問題。 –

+0

你想要做什麼?獲取'車輛'中的所有節點? –

回答

1

如果我理解正確的,你那麼我將與LINQ-to-XML而這樣做: -

XDocument xdoc = XDocument.Load("XMLFile"); 
var vehicleList = xdoc.Root.Descendants("Vehicle") 
             .Where(x => (string)x.Element("Insured") == "Y") 
             .Elements() 
             .Where(x => vehicles.Any(z => z == x.Name)); 

這將返回IEnumerable<XElement>,你可以用foreach循環迭代。此外,如果您想直接檢索該值,則可以像這樣(最後)投影該值 - .Select(x => (string)x),該值將返回IEnumerable<string>

+0

它的返回值爲null :( – CuriousDev

+1

@CuriousDev - 你確定你的XML元素名中沒有空白嗎?是的,你的XML中是否有任何名稱空間?這將會產生巨大的影響。 –

+0

我不確定@Rahul – CuriousDev