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

断了今生、忘了曾经 提交于 2019-12-11 11:09:00

问题


This is the XML to be parsed, using 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>

If I do:

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>
}

It displays:

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

I only want the Key and Value Nodes to display the value. Like:

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

回答1:


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 of an element.)

This can be done as follows:

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));
}

This logic can be extracted into an extension method:

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));
    }
}

And used as follows:

var textValue = element.LocalValue();

It prints the following:

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

Demo fiddle here.



来源:https://stackoverflow.com/questions/28602714/xdocument-descendants-displays-all-child-values-in-the-parent-node

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!