4

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

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

当我调用XMLMNode.InnerText它时,我回来了:

SignalprocessingSignalprocessing

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

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

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

4

4 回答 4

8

XmlNode中的文本实际上是另一个文本类型的XmlNode。这应该有效:

socialTagNode.ChildNodes[0].Value
于 2012-07-12T22:16:48.050 回答
1

文档中,XmlElement.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();

样品小提琴

于 2017-05-15T22:18:19.870 回答
0

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

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

于 2012-07-12T22:20:40.883 回答
0

所以有几点:

  1. 根据定义, InnerText为您提供所有子节点的文本。就 api 为您提供的工具而言,询问“[just] this node 的 InnerText”没有意义。
  2. 您正在寻找的是 Text 类型的子节点(或者可能是 CDATA,具体取决于您的情况)。大多数(全部?)时间这将是第一个 ChildNode。
于 2012-07-12T22:23:10.770 回答