我有以下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的新实例。
答案 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>");