繁体   English   中英

如何在XmlDocument中用元素替换文本

[英]How can I replace text with element in XmlDocument

我有以下xml:

<div>foo 123 <span id=123>bar</span> baz</div>

我想用a元素包装123:

<div>foo <a>123</a> <span id=123>bar</span> baz</div>

我尝试了什么?

1)我不能在div元素的InnerXml上进行替换,例如:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

var xmlElement = xmlDocument.DocumentElement;
xmlElement.InnerXml = xmlElement.InnerXml.Replace("123", "<a>123</a>");

它将导致生成无效的xml:

System.Xml.XmlException:'<',十六进制值0x3C,是无效的属性字符。 第1行,位置26。

2)同样也不允许我替换div元素内的第一个节点的InnerXml,例如:

var childNode = xmlDocument.ChildNodes[0].ChildNodes[0];
childNode.InnerXml = childNode.InnerXml.Replace("123", "<a>123</a>");

因为:

System.InvalidOperationException:无法为当前节点设置'InnerXml',因为它是只读的或不能有子级。

3)我可能会更改第一个Text节点以摆脱“ 123”,在text节点后插入新元素123。 并在具有123的元素之后插入新的文本节点(保留空白)。 但是,它不允许我创建XmlText的新实例。

您可以尝试此代码。 但是请记住,此代码仍需要做一些工作以防止出现异常:

var xmlDocument = new XmlDocument();
xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

// get first child and the ID from second child
var firstChild = xmlDocument.FirstChild.FirstChild;
var id = firstChild.NextSibling.Attributes[0].Value;

// remove the ID from the text
firstChild.Value = firstChild.Value.Replace(id, "");

// create the node and set it's inner text to ID
var node = xmlDocument.CreateNode("element", "a", "");
node.InnerText = id;

// append created element to XML
xmlDocument.FirstChild.InsertAfter(node, firstChild);

这不是一个完美的解决方案,但是您可以用正则表达式替换“ 123”文本:

            var xmlDocument = new XmlDocument();
            xmlDocument.LoadXml("<div>foo 123 <span id='123'>bar</span> baz</div>");

            var xmlElement = xmlDocument.DocumentElement;
            xmlElement.InnerXml = Regex.Replace(xmlElement.InnerXml, "([^\"]123[^\"])", " <a>123</a>");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM