Строка.Исключение форматирования, когда строка формата содержит “{”
-
12-09-2019 - |
Вопрос
Я использую VSTS 2008 + C # + .Net 2.0.При выполнении следующего оператора из String генерируется FormatException.Оператор Format, есть идеи, что не так?
Вот где можно получить template.html, который я использую.Я хочу отформатировать эту часть m= {0} в template.html.
string template = String.Empty;
using (StreamReader textFile = new StreamReader("template.html"))
{
template = textFile.ReadToEnd();
String.Format(template, "video.wmv");
}
http://www.mediafire.com/download.php?u4myvhbmmzg
ПРАВКА 1:
Вот содержание для моего template.html,
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<!-- saved from url=(0014)about:internet -->
<head>
<title>Silverlight Project Test Page </title>
<style type="text/css">
html, body {
height: 100%;
overflow: auto;
}
body {
padding: 0;
margin: 0;
}
#silverlightControlHost {
height: 100%;
}
</style>
<script type="text/javascript">
function onSilverlightError(sender, args) {
var appSource = "";
if (sender != null && sender != 0) {
appSource = sender.getHost().Source;
}
var errorType = args.ErrorType;
var iErrorCode = args.ErrorCode;
var errMsg = "Unhandled Error in Silverlight 2 Application " + appSource + "\n" ;
errMsg += "Code: "+ iErrorCode + " \n";
errMsg += "Category: " + errorType + " \n";
errMsg += "Message: " + args.ErrorMessage + " \n";
if (errorType == "ParserError")
{
errMsg += "File: " + args.xamlFile + " \n";
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
else if (errorType == "RuntimeError")
{
if (args.lineNumber != 0)
{
errMsg += "Line: " + args.lineNumber + " \n";
errMsg += "Position: " + args.charPosition + " \n";
}
errMsg += "MethodName: " + args.methodName + " \n";
}
throw new Error(errMsg);
}
</script>
</head>
<body>
<!-- Runtime errors from Silverlight will be displayed here.
This will contain debugging information and should be removed or hidden when debugging is completed -->
<div id='errorLocation' style="font-size: small;color: Gray;"></div>
<div id="silverlightControlHost">
<object data="data:application/x-silverlight," type="application/x-silverlight-2" width="500" height="240">
<param name="source" value="ClientBin/VideoPlayer.xap"/>
<param name="onerror" value="onSilverlightError" />
<param name="background" value="white" />
<param name="initParams" value="cc=true,markers=true,m={0}" />
<a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;">
<img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
</a>
</object>
<iframe style='visibility:hidden;height:0;width:0;border:0px'></iframe>
</div>
</body>
</html>
огромное спасибо, Джордж
Решение
Предположительно, html содержит javascript или другой источник фигурных скобок ({
и }
), которые все нуждались бы в удвоении (чтобы {{
и }}
) для использования с string.Format
.Я ожидаю, что другой (более очевидный) токен может быть в порядке вещей, т.е. %%FILENAME%%
.Затем используйте либо регулярное выражение, либо string.Replace
.
Если у вас есть один тег, string.Replace
все в порядке;если у вас их много, есть хитрости с регулярным выражением и MatchEvaluator
это может быть полезно - вот так но с другим шаблоном регулярных выражений.
Обновление после добавления примера html:Я бы определенно использовал другой токен;на самом базовом уровне:
<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />
и
template = template.Replace("%%FILENAME%%", "video.wmv");
Другие советы
Ваш шаблон содержит {
и }
символы, которые нужно экранировать, иначе они сбивают с толку String.Format
.Спасайтесь от них, используя {{
и }}
.В качестве альтернативы используйте другой механизм, такой как String.Replace
.
строка.Функция Format() не обрабатывает {
и }
в строке формата.Вам нужно заменить {
с {{
и }
с }}
повсюду в вашем template.html
файл.За исключением единственного места, где вы используете {0}
плейсхолдер.
Не очень элегантно.
Вместо этого рассмотрите возможность использования шаблонизатора.Видишь http://csharp-source.net/open-source/template-engines за некоторые предложения.
Следующее лучшее решение - использовать регулярные выражения (с MatchEvaluator ) или string .Replace(), как предложено в других ответах.
Редактировать:
Вот пример использования шаблонизатора StringTemplate:
StringTemplate htmlpage = new StringTemplate(File.ReadAllText("template.html"));
htmlpage.SetAttribute("content", "video.wmv");
Console.WriteLine(htmlpage.ToString());
Измените одну строку в вашем template.html
файл:
От:
<param name="initParams" value="cc=true,markers=true,m={0}" />
Для:
<param name="initParams" value="cc=true,markers=true,m=$content$" />
Когда движок шаблонов сталкивается $content$
в шаблоне он заменяет его значением атрибута 'content', которое вы задаете с помощью кода.
Используя StringTemplate, вы можете выполнять простые циклы и условные обозначения внутри вашего шаблона.Видишь документация.
Каково содержимое переменной 'template'?
Трудно сказать, что не так с вашим кодом, но, по-видимому, переменная шаблона не содержит строку, которая используется в качестве заполнителя.(Например, "это некоторая строка {0}").
Я думаю, что вам следует воспользоваться инструментами, предоставляемыми вашей IDE:отладив код, используйте watches для проверки содержимого переменной шаблона.
Что находится в файле шаблона?
если есть фигурные скобки, которые не имеют формата {int}, или аргументов для оператора format больше, чем есть, это вызовет исключение.
Какое сообщение содержится в исключении?
Это делает ваш Css.Как упоминал кто-то еще, вам нужно будет заменить регулярное выражение или кучу строк.Команды замены в строке помечают ваши переменные %%ИМЯ_ПЕРЕМЕННОЙ%% и используют замену строки для их замены