后人的XDocument()显示在父节点的所有子值(XDocument Descendants()

2019-10-21 23:03发布

这是要分析的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

我只想键和值节点显示的值。 喜欢:

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

Answer 1:

XElement.Value返回一个包含所有这些元素的文本内容的字符串 ,但要显示刚刚的连结值(一个或多个) XText每个直接拥有的子节点XElement 。 (这些是保存实际的节点的字符数据的元素的。)

这是可以做到如下:

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

演示小提琴这里 。



文章来源: XDocument Descendants() displays all child values in the parent node