2

SGML と XmlDocument を使用して HTML ドキュメントをトラバースします。タイプがテキストの XmlNode を見つけたら、xml 要素を持つその値を変更する必要があります。読み取り専用のため、InnerXml を変更できません。InnerText を変更しようとしましたが、今回はタグ記述子の chars<を and に>エンコードしまし&lt;&gt;。例えば:

<p>
    This is a text that will be highlighted.
    <anothertag />
    <......>
</p>

私はに変更しようとしています:

<p>
    This is a text that will be <span class="highlighted">highlighted</span>.
    <anothertag />
    <......>
</p>

テキスト XmlNode の値を変更する最も簡単な方法は何ですか?

4

3 に答える 3

2

私には回避策があります。それが実際の解決策かどうかはわかりませんが、私が望む結果になる可能性があります。このコードが価値のある解決策であるかどうかについてコメントしてください

    private void traverse(ref XmlNode node)
    {
        XmlNode prevOldElement = null;
        XmlNode prevNewElement = null;
        var element = node.FirstChild;
        do
        {
            if (prevNewElement != null && prevOldElement != null)
            {
                prevOldElement.ParentNode.ReplaceChild(prevNewElement, prevOldElement);
                prevNewElement = null;
                prevOldElement = null;
            }
            if (element.NodeType == XmlNodeType.Text)
            {
                var el = doc.CreateElement("text");
                //Here is manuplation of the InnerXml.
                el.InnerXml = element.Value.Replace(a_search_term, "<b>" + a_search_term + "</b>");
                //I don't replace element right now, because element.NextSibling will be null.
                //So I replace the new element after getting the next sibling.
                prevNewElement = el;
                prevOldElement = element;
            }
            else if (element.HasChildNodes)
                traverse(ref element);
        }
        while ((element = element.NextSibling) != null);
        if (prevNewElement != null && prevOldElement != null)
        {
            prevOldElement.ParentNode.ReplaceChild(prevNewElement, prevOldElement);
        }

    }

また、 traverse 関数の後に文字列を削除<text>します。</text>

        doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.XmlResolver = null;
        doc.Load(sgmlReader);
        var html = doc.FirstChild;
        traverse(ref html);
        textBox1.Text = doc.OuterXml.Replace("<text>", String.Empty).Replace("</text>", String.Empty);
于 2011-10-28T13:35:23.420 に答える
1
using System;
using System.Xml;

public class Sample {

  public static void Main() {
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(
    "<p>" +
    "This is a text that will be highlighted." +
    "<br />" +
    "<img />" +
    "</p>");
    string ImpossibleMark = "_*_";
    XmlNode elem = doc.DocumentElement.FirstChild;
    string thewWord ="highlighted";
    if(elem.NodeType == XmlNodeType.Text){
        string OriginalXml = elem.ParentNode.InnerXml;
        while(OriginalXml.Contains(ImpossibleMark)) ImpossibleMark += ImpossibleMark;
        elem.InnerText = elem.InnerText.Replace(thewWord, ImpossibleMark);
        string replaceString = "<span class=\"highlighted\">" + thewWord + "</span>";
        elem.ParentNode.InnerXml = elem.ParentNode.InnerXml.Replace(ImpossibleMark, replaceString);
    }

    Console.WriteLine(doc.DocumentElement.InnerXml);
  }
}
于 2011-10-26T15:26:56.573 に答える
0

InnerTextプロパティは、のすべての子ノードのテキスト コンテンツを提供しますXmlNode。本当に設定したいのはInnerXmlプロパティで、テキストではなく XML として解釈されます。

于 2011-10-26T12:40:32.110 に答える