有没有办法用其他XElement选择性地替换XElement内容?

我有这个XML:

<prompt>
   There is something I want to tell you.[pause=3]
   You are my favorite caller today.[pause=1]
   Have a great day!
</prompt>


我想这样渲染:

<prompt>
   There is something I want to tell you.<break time="3s"/>
   You are my favorite caller today.<break time="1s"/>
   Have a great day!
</prompt>


我需要用实际的XElement替换占位符,但是当我尝试更改XElement的内容时,.NET当然会转义所有尖括号。我理解为什么通常需要正确地转义内容,但是我需要绕过该行为并将XML直接注入内容中。

这是我本来可以运行的代码。

MatchCollection matches = Regex.Matches(content, @"\[(\w+)=(\d+)]");
foreach (XElement element in voiceXmlDocument.Descendants("prompt"))
{
    if (matches[0] == null)
        continue;
    element.Value = element.Value.Replace(matches[0].Value, @"<break time=""5s""/>");
}


这是一项正在进行中的工作,因此不必担心RegEx模式的有效性,因为我稍后将进行工作以匹配多个条件。这是概念代码的证明,重点是按所述替换占位符。我仅在此处包括迭代和RegEx代码,以说明我需要能够对已经填充了内容的整个文档执行此操作。

最佳答案

您可以使用XElement.Parse()方法:

首先,获取XElement的外部xml,例如,

string outerXml = element.ToString();


您完全可以使用此字符串:

<prompt>
  There is something I want to tell you.[pause=3]
  You are my favorite caller today.[pause=1]
  Have a great day!
</prompt>


那你就可以更换

outerXml = outerXml.Replace(matches[0].Value, @"<break time=""5s""/>");


然后,您可以将其解析回:

XElement repElement = XElement.Parse(outerXml);


最后,替换原始的XElement:

element.ReplaceWith(repElement);

关于c# - 用XElement替换XElement内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34641988/

10-13 08:31