C# 修改文本XmlNode的InnerXml
我使用SGML和XmlDocument遍历html文档。当我找到一个类型为Text的XmlNode时,我需要更改其包含xml元素的值。我无法更改InnerXml,因为它是只读的。我试图更改InnerText,但这次标记描述符字符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> 这是将突出显示的文本。 我
编码为
和
。例如:
<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这样的标记名,那么您的解决方案就不起作用。实际上我也没有直接替换文本。我将文本
拆分为文字。我有一个提供词干的库,我遍历文本中的每个单词,并执行词干工作。所以我只需要处理文本节点。不管怎样,谢谢你。这是肯定的。所以,我有一点修改。我认为这在大多数情况下是足够的。严格地说,可能是无用的,我认为你的方式在这种情况下。简化的方法比我可能不会的要好。