Вы передаете строку, поэтому LINQ to XML считает, что вы хотите, чтобы это был текстовый узел, экранируя текст соответствующим образом.
Похоже, вы действительно хотите включить несколько узлов - некоторый тексти некоторые элементы.
Я бы предложил изменить GenerateSsml
следующим образом:
private string GenerateSsml(string locale, string gender, string name, IEnumerable<XNode> nodes)
{
var ssmlDoc = new XDocument(
new XElement("speak",
new XAttribute("version", "1.0"),
new XAttribute(XNamespace.Xml + "lang", "en-US"),
new XElement("voice",
new XAttribute(XNamespace.Xml + "lang", locale),
new XAttribute(XNamespace.Xml + "gender", gender),
new XAttribute("name", name),
nodes)));
return ssmlDoc.ToString();
}
Затем измените метод вызова на:
var nodes = new XNode[]
{
new XText("During this video we will refer to this as the lens,"),
new XElement("break", new XAttribute("time", "1000ms")),
new XText(" this as the headband"),
new XElement("break", new XAttribute("time", "1000ms")),
new XText(", and these as the frame arms"),
new XElement("break", new XAttribute("time", "1000ms"))
new XText("."),
};
Content = new StringContent(
GenerateSsml(inputOptions.Locale, genderValue, inputOptions.VoiceName, nodes));
Если вывы действительно хотите использовать строковое представление вместо этого, вы могли бы написать:
string text = ...; // Code as before
var element = XElement.Parse($"<root>{text}</root>");
Content = new StringContent(
GenerateSsml(inputOptions.Locale, genderValue, inputOptions.VoiceName, element.Nodes()));