2

给定代码:

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

然后我想提取node b- 在本例中为“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)
    ...
4

3 回答 3

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

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

于 2012-09-27T15:51:04.050 回答
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();
于 2012-09-27T15:42:49.730 回答
0

在 LINQ2XML 中,您可以这样做

foreach(XNode elm in doc.Descendants("b").OfType<XText>())
{
//elm has the text
}
于 2012-09-27T15:53:42.030 回答