【问题标题】:How can I replace text with element in XmlDocument如何用 XmlDocument 中的元素替换文本
【发布时间】:2018-10-07 15:08:54
【问题描述】:

我有以下 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 : '

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

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

因为:

System.InvalidOperationException:无法为 当前节点,因为它要么是只读的,要么不能有子节点。

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

【问题讨论】:

  • 我认为,在加载 xml doument 之前,替换值,它可以工作。因为里面有标签,所以它不能替换值。
  • 你想用 id="123" 处理什么?因为如果将所有 123 替换为 123 则 span 元素将是无效的 xml 格式:"123\">bar "
  • @SaravanakumarNatarajan 感谢您的回复,但是如果我只是替换 123,那么 xml 将变得无效。我也想用 XmlDocument 解决这个问题。
  • @NhanPhan 希望仅在文本中替换 123。
  • @Vladimirs,使用正则表达式操作,将只删除标签内的文本值。在正则表达式中是可能的。

标签: c# xml xmldocument


【解决方案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);

【讨论】:

  • 谢谢!我想我会将此标记为答案,事实证明您可以通过xmlDocument.CreateNode("text", "", "") 创建文本节点。所以我可以选择 3) 至少现在我知道如何创建文本节点了。
  • @Vladimir 很高兴我能帮上忙。
【解决方案2】:

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

【讨论】:

  • 谢谢,这也可以,但这有点hacky。我希望只使用没有正则表达式的 XmlDocument 功能。
  • RegEx 不是处理 XML 的最佳选择。
猜你喜欢
  • 2011-07-22
  • 1970-01-01
  • 2015-11-16
  • 2011-10-19
  • 2011-10-11
  • 2013-01-15
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
相关资源
最近更新 更多