XDocument Descendants() 显示父节点中的所有子值

XDocument Descendants() displays all child values in the parent node

这是要解析的 XML,使用 XDocument:

<e xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <FormValues />
  <Others>
    <Bank>
      <Key>FirstKey</Key>
      <Value>FirstValue</Value>
    </Bank>
    <Bank>
      <Key>SecondKey</Key>
      <Value>SecondValue</Value>
    </Bank>
    <Bank>
      <Key>ThirdKey</Key>
      <Value>ThirdValue</Value>
    </Bank>
    <Bank>
      <Key>FourthKey</Key>
      <Value>FourthValue</Value>
    </Bank>
  </Others>
  <Prob>ProbValue</Prob>
  <URL>http://example.com/</URL>
  <Method>GET</Method>
</e>

如果我这样做:

string doc = "<e xmlns:xsd..> ..... </e>";
System.Xml.Linq.XDocument docNew = System.Xml.Linq.XDocument.Parse(doc);
var elements = docNew.Root.Descendants();
@foreach (var element in elements)
{
    <label>@element.Name.ToString():</label><span>@element.Value.ToString()</span>
}

它显示:

FormValues:
Others: FirstKeyFirstValueSecondKeySecondValueThirdKeyThirdValueFourthKeyFourthValue
Bank : FirstKeyFirstValue
Key  : FirstKey
Value: FirstValue
Bank : SecondKeySecondValue
Key  : SecondKey
Value: SecondValue
Bank : ThirdKeyThirdValue
Key  : ThirdKey
Value: ThirdValue
Bank : FourthKeyFourthValue
Key  : FourthKey
Value: FourthValue
Prob : ProbValue
URL  : http://example.com/
Method:GET

我只希望Key节点和Value节点显示值。 喜欢:

Others
Bank
Key  : FirstKey
Value: FirstValue
Bank
Key  : SecondKey
Value: SecondValue
....

XElement.Value returns a string that contains all of the text content of this element, but you want to display just the concatenated value(s) of the XText child nodes directly owned by each XElement. (These are the nodes that hold the actual character data 一个元素。)

这可以按如下方式完成:

var docNew = System.Xml.Linq.XDocument.Parse(doc);
foreach (var element in docNew.Root.Descendants())
{
    var textValue = string.Concat(element.Nodes().OfType<System.Xml.Linq.XText>().Select(tx => tx.Value));
    Console.WriteLine(string.Format("{0}: {1}", element.Name.ToString(), textValue));
}

这个逻辑可以提取到一个扩展方法中:

public static partial class XNodeExtensions
{
    public static string LocalValue(this XContainer node)
    {
        if (node == null)
            return null;
        return string.Concat(node.Nodes().OfType<XText>().Select(tx => tx.Value));
    }
}

并使用如下:

var textValue = element.LocalValue();

它打印以下内容:

FormValues: 
Others: 
Bank: 
Key: FirstKey
Value: FirstValue
Bank: 
Key: SecondKey
Value: SecondValue
Bank: 
Key: ThirdKey
Value: ThirdValue
Bank: 
Key: FourthKey
Value: FourthValue
Prob: ProbValue
URL: http://example.com/
Method: GET

演示 fiddle here.