使用XDocument将所选节点转换为字符串

时间:2018-04-03 17:19:48

标签: c# xml xml-serialization

我有以下XML示例。

<?xml version="1.0" encoding="utf-8"?>
  <GlobalResponses>
   <Filters>
     <FilterId>11</FilterId>
     <FilterId>5</FilterId>
     <FilterId>10</FilterId>
   </Filters>
   <Responses>
     <Response>
       <Name>Bob</Name>
     </Response>
     <Response>
       <Name>Jim</Name>
     </Response>
     <Response>
       <Name>Steve</Name>
     </Response>    
   </Responses>  
  </GlobalResponses>

使用XDocument,我如何才能获得<Responses>父节点和子节点,并将它们转换为字符串变量。我查看了XDocument Elements和Descendants,但是通过调用oXDocument.Descendants("Responses").ToString();没有工作。

我是否必须遍历检查每个XElements的所有XElements然后附加到字符串变量?

2 个答案:

答案 0 :(得分:1)

函数Descendants返回XElement的枚举,因此您需要选择特定元素。

如果要获取包含所有子节点的XML元素,可以使用:

// assuming that you only have one tag Responses.
oXDocument.Descendants("Responses").First().ToString();

结果是

<Responses>
  <Response>
    <Name>Bob</Name>
  </Response>
  <Response>
    <Name>Jim</Name>
  </Response>
  <Response>
    <Name>Steve</Name>
  </Response>
</Responses>

如果要获取子节点并将它们连接到单个字符串,可以使用

// Extract list of names
var names = doc.Descendants("Responses").Elements("Response").Select(x => x.Value);
// concatenate
var result = string.Join(", ", names);

结果为Bob, Jim, Steve

答案 1 :(得分:0)

Descendants()方法接受输入元素名称,它将返回一组节点,然后您还需要获取您感兴趣的元素。

您可以使用linq和XDocument来提取信息。例如,以下代码从每个Name节点中提取Response元素值并打印出来:

var nodes = from response in Doc.Descendants("Response")
            select response.Element("Name").Value;

foreach(var node in nodes)
    Console.WriteLine(node);

上面Doc.Descendants("Response")将获取所有<Response>元素,然后我们使用response.Element("Name")为每个<Element>元素获取<Response>标记,然后使用.Value属性我们得到标记之间的值。

See this working DEMO fiddle