使用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
它应该包含主节点内的所有文本节点并忽略子元素
所以有一些事情:
- 根据定义, InnerText为您提供所有子节点的文本。 要求“[这个节点的内部文本]”在api给你的工具方面没有意义。
- 您正在寻找的是Text类型的子节点(或者可能是CDATA,具体取决于您的具体情况)。 大多数(全部?)次,这将是第一个ChildNode。