Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改文本XmlNode的InnerXml_C#_Xml Parsing_Xmldocument_Sgmlreader - Fatal编程技术网

C# 修改文本XmlNode的InnerXml

C# 修改文本XmlNode的InnerXml,c#,xml-parsing,xmldocument,sgmlreader,C#,Xml Parsing,Xmldocument,Sgmlreader,我使用SGML和XmlDocument遍历html文档。当我找到一个类型为Text的XmlNode时,我需要更改其包含xml元素的值。我无法更改InnerXml,因为它是只读的。我试图更改InnerText,但这次标记描述符字符编码为和。例如: <p> This is a text that will be highlighted. <anothertag /> <......> </p> 这是将突出显示的文本。 我

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

<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值的最简单方法是什么?

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

使用系统;
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);
  }
}
使用System.Xml; 公共类样本{ 公共静态void Main(){ XmlDocument doc=新的XmlDocument(); doc.LoadXml( “”+ “这是将突出显示的文本。”+ “
”+ "" + “

”; 字符串不可能标记=“*389;”; XmlNode elem=doc.DocumentElement.FirstChild; 字符串thewWord=“突出显示”; if(elem.NodeType==XmlNodeType.Text){ 字符串OriginalXml=elem.ParentNode.InnerXml; 而(OriginalXml.Contains(ImpossibleMark))ImpossibleMark+=ImpossibleMark; elem.InnerText=elem.InnerText.Replace(单词,不可能的标记); string replaceString=“”+thewWord+”; elem.ParentNode.InnerXml=elem.ParentNode.InnerXml.Replace(不可能的标记,replaceString); } WriteLine(doc.DocumentElement.InnerXml); } }
我有一个解决办法,我不知道这是一个真正的解决方案或什么,但它可以产生我想要的结果。请评论此代码是否值得解决

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

    }
private void遍历(ref XmlNode节点)
{
XmlNode prevOldElement=null;
XmlNode prevNewElement=null;
var元素=node.FirstChild;
做
{
if(prevNewElement!=null&&prevOldElement!=null)
{
prevOldElement.ParentNode.ReplaceChild(prevNewElement,prevOldElement);
prevNewElement=null;
prevOldElement=null;
}
if(element.NodeType==XmlNodeType.Text)
{
var el=doc.CreateElement(“文本”);
//下面是InnerXml的制作。
el.InnerXml=element.Value.Replace(a_search_term,“+a_search_term+”);
//我现在不替换元素,因为element.NextSibling将为null。
//所以我在得到下一个兄弟后替换新元素。
prevNewElement=el;
prevOldElement=元素;
}
else if(element.HasChildNodes)
导线测量(参考元素);
}
while((element=element.NextSibling)!=null);
if(prevNewElement!=null&&prevOldElement!=null)
{
prevOldElement.ParentNode.ReplaceChild(prevNewElement,prevOldElement);
}
}
另外,我在遍历函数之后删除
字符串:

        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);
doc=newxmldocument();
doc.PreserveWhitespace=true;
doc.xmlsolver=null;
文件加载(sgmlReader);
var html=doc.FirstChild;
遍历(参考html);
textBox1.Text=doc.OuterXml.Replace(“,String.Empty”).Replace(“,String.Empty);

是,谢谢,但是如果XmlNode的类型是
Text
,InnerXml属性是只读的。我需要另一个解决方案。如果InnerXML有一个名为“highlighted”的标记,或者如果搜索词是一个像span这样的标记名,那么您的解决方案就不起作用。实际上我也没有直接替换文本。我将
文本
拆分为文字。我有一个提供词干的库,我遍历
文本中的每个单词,并执行词干工作。所以我只需要处理文本节点。不管怎样,谢谢你。这是肯定的。所以,我有一点修改。我认为这在大多数情况下是足够的。严格地说,可能是无用的,我认为你的方式在这种情况下。简化的方法比我可能不会的要好。