2017-03-15 52 views
0

中提取数据,我有一个包含这样的元素的列表:Linq的语句从的XElement

{<d:element m:type="SP.KeyValue" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"> 
    <d:Key>Path</d:Key> 
    <d:Value>https://my.home.site.com</d:Value> 
    <d:ValueType>Edm.String</d:ValueType> 
</d:element>} 

我想帮助辨别来自上述名单只提取“https://my.home.site.com”的价值观所需要的LINQ的声明<>。这里的问题是,我们不仅可以使用<d:Value>,因为只有此列表中具有<d:Key> Path值的XElement(如上例所示)实际上包含<d:Value>项中的URL。

有谁知道会执行上述数据提取的魔术Linq语句吗?

+0

这些XElements从哪里来?它只是一个列表? –

+0

首先,您可以将列表转换为POCO吗?如果是这样,那么你可以做'myList.Where(x => x.key!= null)' 如果你不能最好的选择是使用正则表达式来匹配key值的存在并且提取在价值标签中。 –

+0

你最好的选择绝对不会是使用正则表达式 – Jonesopolis

回答

2

假设你的数据从类似这样的XML文件来:

<?xml version="1.0"?> 
<root xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices"> 
    <d:element m:type="SP.KeyValue"> 
     <d:Key>Path</d:Key> 
     <d:Value>https://my.home.site.com</d:Value> 
     <d:ValueType>Edm.String</d:ValueType> 
    </d:element> 
    <d:element m:type="SP.KeyValue"> 
     <d:Key>NotPath</d:Key> 
     <d:Value>https://my.home.site.com</d:Value> 
     <d:ValueType>Edm.String</d:ValueType> 
    </d:element> 
</root> 

下面的代码:

XElement root = XElement.Load("Some file"); 
List<string> urls; 

//Query Syntax 
urls = (from e in root.Elements(d + "element") 
     where e.Element(d + "Key").Value == "Path" 
     select e.Element(d + "Value").Value); 
//Or 

//Method Syntax 
urls = (from e in root.Elements(d + "element") 
     where e.Element(d + "Key").Value == "Path" 
     select e.Element(d + "Value").Value).ToList(); 

Console.WriteLine(string.Join(",", urls)); 

会导致(请注意,它忽略了 “NotPath” 键):

https://my.home.site.com

您可以查看实时示例here并查看this了解更多XElement信息。

+0

非常棒!谢谢,那有效。 –

1

如果你确实有一个ListXElement的:

var list = new List<XElement>(); //however you get your XElement collection 

var values = list.Where(x => x.Elements().First(e => e.Name.LocalName == "Key").Value == "Path") 
       .Select(x => x.Elements().First(e => e.Name.LocalName == "Value").Value) 

如果你有一个XDocument,你只是修改查询的开始略有下降。

0

我认为这个问题,如果与naespace声明。试试这个:

string xml = "<d:element m:type=\"SP.KeyValue\" xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\" xmlns:d=\"http://schemas.microsoft.com/ado/2007/08/dataservices\">"+ 
"<d:Key>Path</d:Key>"+ 
"<d:Value>https://my.home.site.com</d:Value>"+ 
"<d:ValueType>Edm.String</d:ValueType>"+ 
"</d:element>"; 

XDocument xmlObj = XDocument.Parse(xml); 
XNamespace ns_d = "http://schemas.microsoft.com/ado/2007/08/dataservices"; 
var result = xmlObj.Descendants(ns_d + "Value").Select(x => x.Value); 
+0

你是正确的名称空间是问题的一部分...这是我的代码工作,基于amura.cxg的答案: var url =(from e in items.Elements(d +“element”) where e。 Element(d +“Key”)。Value ==“Path” select e.Element(d +“Value”)。Value); –