使用XmlNode获取当前节点的InnerText

我有一个XMLNode,其主体如下所示:(通过OpenCalais)

Signal processing Signal processing  

当我在上面调用XMLMNode.InnerText时,我会回来:

 SignalprocessingSignalprocessing 

但是,我只想要标签本身的InnerText,而不是子’原始值’节点的InnerText。

当我调用XMLNode.Value ,它返回null。

如何在不连接其他子节点的所有InnerTexts的情况下获取此节点的InnerText?

XmlNode中的文本实际上是另一个text类型的XmlNode 。 这应该工作:

 socialTagNode.ChildNodes[0].Value 

来自docs , XmlElement.InnerText

获取或设置节点及其所有子节点的连接值。

虽然这个语句并不完全清楚,但它意味着该属性会降低元素下的DOM层次结构,并将所有文本值连接到返回值 – 您看到的行为。

扩展接受的答案,这里是从参考源改编的扩展方法,它收集并返回给定节点的所有直接文本子节点:

 public static partial class XmlNodeExtensions { ///  /// Returns all immediate text values of the given node, concatenated into a string ///  ///  ///  public static string SelfInnerText(this XmlNode node) { // Adapted from http://referencesource.microsoft.com/#System.Xml/System/Xml/Dom/XmlNode.cs,66df5d2e6b0bf5ae,references if (node == null) return null; else if (node is XmlProcessingInstruction || node is XmlDeclaration || node is XmlCharacterData) { // These are overridden in the reference source. return node.InnerText; } else { var firstChild = node.FirstChild; if (firstChild == null) return string.Empty; else if (firstChild.IsNonCommentText() && firstChild.NextSibling == null) return firstChild.InnerText; // Optimization. var builder = new StringBuilder(); for (var child = firstChild; child != null; child = child.NextSibling) { if (child.IsNonCommentText()) builder.Append(child.InnerText); } return builder.ToString(); } } ///  /// Enumerates all immediate text values of the given node. ///  ///  ///  public static IEnumerable SelfInnerTexts(this XmlNode node) { // Adapted from http://referencesource.microsoft.com/#System.Xml/System/Xml/Dom/XmlNode.cs,66df5d2e6b0bf5ae,references if (node == null) yield break; else if (node is XmlProcessingInstruction || node is XmlDeclaration || node is XmlCharacterData) { // These are overridden in the reference source. yield return node.InnerText; } else { var firstChild = node.FirstChild; for (var child = firstChild; child != null; child = child.NextSibling) { if (child.IsNonCommentText()) yield return child.InnerText; } } } public static bool IsNonCommentText(this XmlNode node) { return node != null && (node.NodeType == XmlNodeType.Text || node.NodeType == XmlNodeType.CDATA || node.NodeType == XmlNodeType.Whitespace || node.NodeType == XmlNodeType.SignificantWhitespace); } } 

然后使用它像:

 var value = XMLMNode.SelfInnerText(); 

样品小提琴 。

您可以尝试以下方法,使用node标记:

 var result=""; var nodes = node.childNodes for (var i=0,len=nodes.length; i 

它应该包含主节点内的所有文本节点并忽略子元素

所以有一些事情:

  1. 根据定义, InnerText为您提供所有子节点的文本。 要求“[这个节点的内部文本]”在api给你的工具方面没有意义。
  2. 您正在寻找的是Text类型的子节点(或者可能是CDATA,具体取决于您的具体情况)。 大多数(全部?)次,这将是第一个ChildNode。