从XmlNode中提取“文本”值的最佳方法是什么?

时间:2012-09-27 15:33:15

标签: c# xml xmlnode

鉴于代码:

  var doc = new XmlDocument();
  doc.LoadXml(@"<a>
                    <b>test
                        <c>test2</c>
                    </b>
                </a>");
  var node = doc.SelectNodes("/a/b")[0];

然后我想提取node b的'text'值 - 在本例中为“test”,而不从所有子节点中检索所有文本元素(如。innerText那样)

我发现自己诉诸于此代码

 var elementText = node.ChildNodes.Cast<XmlNode>().First(a => a.NodeType == XmlNodeType.Text).Value;

不幸的是,node.Value在这种情况下做了其他事情

是否有更整洁/内置的方式而不诉诸linq铸造?这不会让我做类似的事情;

foreach (var childNode in node.ChildNodes)
   if (childNode.NodeType==XmlNodeType.Text)
    ...

3 个答案:

答案 0 :(得分:4)

我更喜欢XDocumentXmlDocument,我认为它更容易使用。您可以使用Element方法轻松获取值,以查找“b”元素,然后使用Value属性。

using(var stream = new MemoryStream())
{
    using(var streamWriter = new StreamWriter(stream))
    {
        streamWriter.Write(@"<a>
                                 <b>test
                                     <c>test2</c>
                                 </b>
                             </a>");
        streamWriter.Flush();
        streamWriter.BaseStream.Seek(0, SeekOrigin.Begin);
        var doc = XDocument.Load(stream);
        Console.WriteLine(doc.Element("a").Element("b").FirstNode.ToString());
    }
}

编辑:如评论中所述,这将得到不正确的值。我已正确更新。

答案 1 :(得分:0)

您想使用node.InnerText而不是Value。所以你会有这个:

 foreach(XmlNode child in node.ChildNodes)
 {
    if (string.IsNullOrEmpty(s))
    {
        s = child.InnerText;
    }
    else
    {
        s = s.Replace(child.InnerText, "");
    }
 }

   s.Trim();

答案 2 :(得分:0)

在LINQ2XML中,你可以这样做

foreach(XNode elm in doc.Descendants("b").OfType<XText>())
{
//elm has the text
}