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

时间:2018-10-07 15:08:54

标签: c# xml 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的新实例。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

这不是一个完美的解决方案,但是您可以用正则表达式替换“ 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>");