Изменение InnerXml текстового XmlNode - PullRequest
2 голосов
/ 26 октября 2011

Я перехожу HTML-документ с SGML и XmlDocument.Когда я нахожу XmlNode с типом Text, мне нужно изменить его значение с элементом xml.Я не могу изменить InnerXml, потому что он доступен только для чтения.Я пытался изменить InnerText, но в этом дескрипторе тега времени символы < и > закодированы в &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?

Ответы [ 3 ]

2 голосов
/ 28 октября 2011

У меня есть обходной путь, я не знаю, является ли это реальным решением или чем, но это может привести к тому, что я хочу.Прокомментируйте этот код, если это достойное решение или нет

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

    }

Также я удаляю строки <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);
1 голос
/ 26 октября 2011
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);
  }
}
0 голосов
/ 26 октября 2011

Свойство InnerText предоставит вам текстовое содержимое всех дочерних узлов XmlNode.То, что вы действительно хотите установить, это InnerXml свойство , которое будет интерпретироваться как XML, а не как текст.

...