使用以下LINQ表达式的元素:
VAR MAPINFO </跨度> =来自XElement.Elements中的nm(“PQTemplate”) where(string)nm.Attribute(“documentID”)== sRequests [0] .Split(‘\ t’)[0 …
要从LINQ查询中获取单个值,您必须调用它 First 要么 FirstOrDefault 。如果你打电话 FirstOrDefault 如果查询没有返回匹配项,它将不会抛出异常。
First
FirstOrDefault
string repName = doc.Elements("PQTemplate") .Where(e => (string)a.Attribute("documentID") == sRequests[0].Split('\t')[0]) .Select(e => (string)e.Attribute("documentType")) .FirstOrDefault();
此外,您不需要打电话 ToString() 上 XAttribute.Value 因为它已经是一个 string 。
ToString()
XAttribute.Value
string
Linq查询返回集合。做 for each 过度 repName 要么
for each
repName
repName.First().ToString()
如果这就是你所需要的。
您的解决方案取决于多少元素 DocumentType 存在于您的XML中。如果它只是一个(我想的)你可以使用 repName.First().ToString() 。
DocumentType
如果属性可能出现多次,则应使用循环:
var result = new List<string>(); foreach(var a in (from d in mapInfo.Attributes("documentType") select d.Value) result.Add(a.ToString());
甚至更短:
result = mapInfo.Attributes("documentType").Select(x => x.Value.ToString());
这将返回枚举。
更改
var mapInfo = from nm in XElement.Elements("PQTemplate") where (string)nm.Attribute("documentID") == sRequests[0].Split('\t')[0] select nm;
至
var mapInfo = from nm in XElement.Elements("PQTemplate") where (string)nm.Attribute("documentID") == sRequests[0].Split('\t')[0] select nm.Attribute("documentType").Value;
然后 mapInfo.First() 会给你你想要的价值。
mapInfo.First()
那是因为 repName 会回来的 IEnumerable<string> 为了所有的 mapInfo 。
IEnumerable<string>
mapInfo
IEnumerable<string> repName = from d in mapInfo.Attributes("documentType") select d.Value;
所以要么使用a foreach 如果你怀疑你可能获得更多的价值或使用循环 First 得到这样的第一个属性: -
foreach
string reportName = mapInfo.First().Attribute("documentType").Value;