问题
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