TWIML 动词中的特殊字符

Special Characters in TWIML verb

我有一个动词需要用西班牙语阅读。但是,Twilio .Net 解析器因给定编码中的无效字符而失败。失败的行(为简洁起见进行了编辑)是:

> <Say voice="man" language="es">cita para la instalación de alfombra,
> el lunes, 15 de enero</Say>

我的XML定义为<?xml version="1.0" encoding="utf-8"?>

如何使 Twilio .Net 库正确解析该字符?如果我将它直接放在 TWIML bin 中它可以工作,但是,.Net SDK 不会解析它。

更新:添加代码示例

我正在使用帮助程序库生成 VoiceResponse 对象并通过 webhook 返回它们。例如:

foreach (var (translation, date) in installations)
{
    gather.Append(new Say($"{translation} {SpanishDate(date)}", Say.VoiceEnum.Man, language: "es"));
}
public static string SpanishDate(DateTime date)
{
return $"el {date.ToString("dddd", new CultureInfo("es-ES"))}, {(date.Day == 1 ? "primo" : date.Day.ToString())} de {date.ToString("MMMM", new CultureInfo("es-ES"))}";
}

我正在查看帮助程序库返回的结果 XML,即:

<Say voice="man" language="es">Cita para la instalacion de pisos de madera  el miércoles, 28 de febrero</Say>

VoiceResponse 对象(使用 ToString() 方法)生成的 XML 存储在 blob 存储中,直到发出调用,然后在 webhook 中作为 TwiMLResult 返回。

辅助库的 TwiMLResult 构造函数正在抛出异常,该构造函数正在尝试解析 XML 但失败了。

at System.Xml.XmlTextReaderImpl.Throw(Exception e) 
at System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount) 
at System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount) 
at System.Xml.XmlTextReaderImpl.ReadData() 
at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) 
at System.Xml.XmlTextReaderImpl.FinishPartialValue() 
at System.Xml.XmlTextReaderImpl.get_Value() 
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) 
at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) 
at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) 
at Twilio.AspNet.Mvc.TwiMLResult.LoadFromString(String twiml, Encoding encoding) 
at Twilio.AspNet.Mvc.TwiMLResult..ctor(String twiml) 

这里是 Twilio 开发人员布道者。

查看您发布的示例,您似乎没有使用可以找到的帮助程序库生成 TwiML here。您可以通过 运行:

安装

Install-Package Twilio

我使用与您相同的字符串编写了一个示例应用程序,并生成了正确的 XML。

public IActionResult Index()
{       
    var response = new VoiceResponse();
    response.Say("cita para la instalación de alfombra, el lunes, 15 de enero!", language: "es");

    return Content(response.ToString(), "text/xml");
}

以上returns:

<?xml version="1.0" encoding="utf-8"?>
<Response>
  <Say language="es">cita para la instalación de alfombra, el lunes, 15 de enero!</Say>
</Response>

希望对您有所帮助。

在查看了@Marcos 是如何做他的示例之后,我发现当我 return TwiMLResult 中的 pre-rendered XML 时,我没有将编码设置为 UTF8 .正确的做法是(示例):

var xml = voiceResponse.ToString();
var result = new TwiMLResult(xml, Encoding.UTF8);