繁体   English   中英

使用XmlNode获取当前节点的InnerText

[英]Obtaining InnerText of just the current node with XmlNode

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

    <SocialTag importance="2">Signal processing
<originalValue>Signal processing</originalValue>
</SocialTag>

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

SignalprocessingSignalprocessing

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

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

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

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

socialTagNode.ChildNodes[0].Value

来自docsXmlElement.InnerText

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

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

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

public static partial class XmlNodeExtensions
{
    /// <summary>
    /// Returns all immediate text values of the given node, concatenated into a string
    /// </summary>
    /// <param name="node"></param>
    /// <returns></returns>
    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();
        }
    }

    /// <summary>
    /// Enumerates all immediate text values of the given node.
    /// </summary>
    /// <param name="node"></param>
    /// <returns></returns>
    public static IEnumerable<string> 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<len; i++)
{
   var node=nodes[i];
   if (node.nodeType==node.TEXT_NODE)
   {
       result += node.nodeValue;
   }
}

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

所以有一些事情:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM