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内のテキストは、実際にはtextタイプの別の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は、すべての子ノードのテキストを提供します。「[ちょうど]このノードのInnerText」を要求することは、APIが提供するツールの観点からは意味がありません。
  2. 探しているのは、テキストタイプの子ノード(または状況によってはCDATA)です。ほとんど(すべて?)の場合、これが最初のChildNodeになります。
于 2012-07-12T22:23:10.770 に答える