如何用 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>");
我关注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>");