string.format exception format string이 "{"를 포함 할 때
-
12-09-2019 - |
문제
VSTS 2008 + C# + .NET 2.0을 사용하고 있습니다. 다음 진술을 실행할 때 string.format 문에서 포르 메이트 락스크가 발생합니다. 어떤 아이디어가 무엇입니까?
여기에 사용중인 Template.html을 얻을 수있는 위치가 있습니다. 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>
Avdance, George에 감사드립니다
해결책
추측 할 때, HTML에는 JavaScript 또는 다른 교정기 소스가 포함되어 있습니다 ({
그리고 }
) 모두 두 배가 필요합니다 (to {{
그리고 }}
)와 함께 사용할 수 있습니다 string.Format
. 나는 다른 (더 명백한) 토큰이 순서대로 될 것으로 기대합니다. %%FILENAME%%
. 그런 다음 Regex 또는 중 하나를 사용하십시오 string.Replace
.
단일 태그가있는 경우 string.Replace
괜찮습니다; 많이 가지고 있다면 Regex와 MatchEvaluator
도움이 될 수 있습니다. 그렇게 좋아요 그러나 다른 정규 패턴으로.
HTML이 추가 된 예제 이후 업데이트 : 나는 분명히 다른 토큰을 사용합니다. 가장 기본적인 수준에서 :
<param name="initParams" value="cc=true,markers=true,m=%%FILENAME%%" />
그리고
template = template.Replace("%%FILENAME%%", "video.wmv");
다른 팁
템플릿에 포함됩니다 {
그리고 }
탈출 해야하는 캐릭터, 그렇지 않으면 혼란 스럽습니다. String.Format
. 그것들을 사용하여 탈출하십시오 {{
그리고 }}
. 또는 다른 메커니즘을 사용하십시오 String.Replace
.
String.format ()가 처리되지 않습니다 {
그리고 }
형식 문자열로. 교체해야합니다 {
~와 함께 {{
그리고 }
~와 함께 }}
당신의 모든 곳 template.html
파일. 당신이 사용하는 단일 장소를 제외하고 {0}
자리 표시 자.
그다지 우아하지 않습니다.
대신 템플릿 엔진 사용을 고려하십시오. 보다 http://csharp-source.net/open-source/template-engines 몇 가지 제안을 위해.
다음으로 가장 좋은 솔루션은 다른 답변에서 제안한대로 Regexes (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을 사용하면 템플릿 내에서 간단한 루핑 및 조건부를 수행 할 수 있습니다. 보다 문서.
WAT '템플릿'변수의 내용은?
코드에 무엇이 잘못되었는지 말하기는 어렵지만 아마도 템플릿 변수에는 장소 홀더로 문자열이 포함되어 있지 않습니다. (예 : "이것은 일부 문자열 {0}").
IDE가 제공하는 도구를 사용해야한다고 생각합니다. 코드를 디버깅하고 시계를 사용하여 템플릿 변수의 내용을 검사하십시오.
템플릿 파일에 무엇이 있습니까?
형식 {int}가 아닌 곱슬 괄호가 있거나 형식 문에 대한 인수가있는 것보다 더 많은 괄호가있는 경우 예외가 발생합니다.
예외의 메시지는 무엇입니까?
그것은 당신의 CSS입니다. Somoene Else가 언급했듯이 REGEX 교체 또는 많은 문자열이 필요합니다. 행 마크에서 명령을 다시 표시해야합니다.