如何用 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 : '<', hexadecimal value 0x3C, is an invalid attribute character. Line 1, position 26.

2) 此外,它不允许我替换 div 元素内第一个节点的 InnerXml,例如:

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

因为:

System.InvalidOperationException : Cannot set the 'InnerXml' for the current node because it is either read-only or cannot have children.

3) 我可能会更改第一个文本节点以删除“123”,在文本节点后插入带有 123 的新元素。并在带有 123 的元素之后插入新的文本节点(剩余的白色-space)。但是它不允许我创建 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>");