如何:检索元素的浅值
本主题说明如何获取元素的浅值。 浅值只是特定元素的值,与深值相反,包括串联成一个单一字符串的所有子元素的值。
使用强制转换或 XElement.Value 属性检索元素值时,您可以检索深值。 要检索浅值,您可以使用 ShallowValue 扩展方法,如以下示例所示。 当根据内容选择元素时,检索浅值十分有用。
下面的示例声明了检索元素浅值的扩展方法。 然后在查询中使用该扩展方法列出包含计算得出的值的所有元素。
示例
下面的文本文件 Report.xml 是此示例的源。
<?xml version="1.0" encoding="utf-8" ?>
<Report>
<Section>
<Heading>
<Column Name="CustomerId">=Customer.CustomerId.Heading</Column>
<Column Name="Name">=Customer.Name.Heading</Column>
</Heading>
<Detail>
<Column Name="CustomerId">=Customer.CustomerId</Column>
<Column Name="Name">=Customer.Name</Column>
</Detail>
</Section>
</Report>
public static class MyExtensions
{
public static string ShallowValue(this XElement xe)
{
return xe
.Nodes()
.OfType<XText>()
.Aggregate(new StringBuilder(),
(s, c) => s.Append(c),
s => s.ToString());
}
}
class Program
{
static void Main(string[] args)
{
XElement root = XElement.Load("Report.xml");
IEnumerable<XElement> query = from el in root.Descendants()
where el.ShallowValue().StartsWith("=")
select el;
foreach (var q in query)
{
Console.WriteLine("{0}{1}{2}",
q.Name.ToString().PadRight(8),
q.Attribute("Name").ToString().PadRight(20),
q.ShallowValue());
}
}
}
Module Module1
<System.Runtime.CompilerServices.Extension()> _
Public Function ShallowValue(ByVal xe As XElement)
Return xe _
.Nodes() _
.OfType(Of XText)() _
.Aggregate(New StringBuilder(), _
Function(s, c) s.Append(c), _
Function(s) s.ToString())
End Function
Sub Main()
Dim root As XElement = XElement.Load("Report.xml")
Dim query As IEnumerable(Of XElement) = _
From el In root.Descendants() _
Where (el.ShallowValue().StartsWith("=")) _
Select el
For Each q As XElement In query
Console.WriteLine("{0}{1}{2}", _
q.Name.ToString().PadRight(8), _
q.Attribute("Name").ToString().PadRight(20), _
q.ShallowValue())
Next
End Sub
End Module
此示例产生以下输出:
Column Name="CustomerId" =Customer.CustomerId.Heading
Column Name="Name" =Customer.Name.Heading
Column Name="CustomerId" =Customer.CustomerId
Column Name="Name" =Customer.Name