Reputation: 45771
I am using VSTS 2008 + C# + .Net 2.0. When executing the following statement, there is FormatException thrown from String.Format statement, any ideas what is wrong?
Here is where to get the template.html I am using. I want to format this part m={0} in 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
EDIT 1:
Here is the content for my 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>
thanks in avdance, George
Upvotes: 37
Views: 46346
Reputation: 100766
string.Format() does not handle {
and }
in the format string. You need to replace {
with {{
and }
with }}
everywhere in your template.html
file. Except for the single place where you use the {0}
placeholder.
Not very elegant.
Instead, consider using a template engine. See http://csharp-source.net/open-source/template-engines for some suggestions.
The next-best solution is to use regexes (with MatchEvaluator) or string.Replace(), as suggested by other answers.
Edit:
Here's an example using the StringTemplate template engine:
StringTemplate htmlpage = new StringTemplate(File.ReadAllText("template.html"));
htmlpage.SetAttribute("content", "video.wmv");
Console.WriteLine(htmlpage.ToString());
Change a single line in your template.html
file:
from:
<param name="initParams" value="cc=true,markers=true,m={0}" />
to:
<param name="initParams" value="cc=true,markers=true,m=$content$" />
When the template engine encounters $content$
in the template, it replaces it with the value of the 'content' attribute that you set using code.
Using StringTemplate, you can do simple looping and conditionals within your template. See the documentation.
Upvotes: 7
Reputation: 55760
Whats in the template file?
if there are curly brackets that are not of the format {int} or there are more than there are arguments for the format statement, it'll throw an exception.
What is the message in the exception?
It's your Css thats doing it. As somoene else mentioned you'll need to doa regex replace, or a bunch of String.Replace commands in a row mark you variables with %%VARIABLE_NAME%% and use string replacement to replace them
Upvotes: 0
Reputation: 1062770
At a guess, the html contains javascript or another source of braces ({
and }
) which would all need doubling (to {{
and }}
) to be usable with string.Format
. I expect a different (more obvious) token may be in order, i.e. %%FILENAME%%
. Then use either regex or string.Replace
.
If you have a single tag, string.Replace
is fine; if you have lots, there are tricks with regex and MatchEvaluator
that may be helpful - like so but with a different regex pattern.
Update after the example html added: I would definitely use a different token; at the most basic level:
<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />
and
template = template.Replace("%%FILENAME%%", "video.wmv");
Upvotes: 69
Reputation: 41266
Your template contains {
and }
characters which need to be escaped, otherwise they confuse String.Format
. Escape them using {{
and }}
. Alternatively, use a different mechanism such as String.Replace
.
Upvotes: 20
Reputation: 56934
Wat are the contents of the 'template' variable ?
Difficult to say what 's wrong with your code, but presumably, the template variable does not contain a string which as a place-holder. (Like "this is some string {0}").
I think that you should make use of the tools your IDE provides: debug the code, use watches to inspect the contents of the template variable.
Upvotes: 1