首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改文本XmlNode的InnerXml

修改文本XmlNode的InnerXml
EN

Stack Overflow用户
提问于 2011-10-26 20:25:18
回答 3查看 10K关注 0票数 2

我使用SGML和XmlDocument遍历html文档。当我找到一个类型为Text的XmlNode时,我需要更改它的值,该值包含一个xml元素。我不能更改InnerXml,因为它是只读的。我尝试更改InnerText,但这次标记描述符字符<>编码为&lt;&gt;。例如:

代码语言:javascript
复制
<p>
    This is a text that will be highlighted.
    <anothertag />
    <......>
</p>

我正在尝试更改为:

代码语言:javascript
复制
<p>
    This is a text that will be <span class="highlighted">highlighted</span>.
    <anothertag />
    <......>
</p>

修改文本XmlNode的值最简单的方法是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-28 21:35:23

我有一个变通方法,我不知道它是一个真正的解决方案还是什么,但它可以产生我想要的结果。请对此代码进行评论,看看它是否值得解决

代码语言:javascript
复制
    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>字符串:

代码语言:javascript
复制
        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);
票数 2
EN

Stack Overflow用户

发布于 2011-10-26 23:26:57

代码语言:javascript
复制
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);
  }
}
票数 1
EN

Stack Overflow用户

发布于 2011-10-26 20:40:32

InnerText property将为您提供XmlNode的所有子节点的文本内容。您真正想要设置的是InnerXml property,它将被解释为XML,而不是文本。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7902515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档