XML 문자열을 반환해야하는 WCF 서비스가 있습니다. 하지만 작가는 문자열이 아닌 파일 만 만들고 싶어하는 것 같습니다. 나는 시도했다 :
string nextXMLstring = "";
using (XmlWriter writer = XmlWriter.Create(nextXMLstring))
이것은 nextXMLstring에 파일 경로가 없다는 오류를 생성합니다. 다음과 같은 것을 원합니다.
using (XmlWriter writer = XmlWriter.Create("nextXMLstring.xml"))
내 XML을 구축 한 다음 문자열로 반환하려면 어떻게해야합니까 ??
감사!!
답변
StringWriter를 만들고이를 XmlWriter에 전달해야합니다.
XmlWriter.Create의 문자열 오버로드는 파일 이름에 대한 것입니다.
예
using (var sw = new StringWriter()) {
using (var xw = XmlWriter.Create(sw)) {
// Build Xml with xw.
}
return sw.ToString();
}
답변
Richard가 말했듯 StringWriter
이 앞으로 나아갈 길입니다. 그러나 한 가지 문제가 있습니다. 기본적 StringWriter
으로 UTF-16으로 자신을 광고합니다. 일반적으로 XML은 UTF-8입니다. StringWriter를 서브 클래 싱하여이 문제를 해결할 수 있습니다.
public class Utf8StringWriter : StringWriter
{
public override Encoding Encoding
{
get { return Encoding.UTF8; }
}
}
에서 작성한 선언에 영향을 미칩니다 XmlWriter
. 물론 이진 형식으로 다른 곳에 문자열을 작성하는 경우 .NET Framework에 대해 수정 한 인코딩과 일치하는 인코딩을 사용해야합니다 StringWriter
. (위의 코드는 항상 UTF-8을 가정합니다. 생성자에서 인코딩을 허용하는보다 일반적인 버전을 만드는 것은 간단합니다.)
그런 다음 다음을 사용합니다.
using (TextWriter writer = new Utf8StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(writer))
{
...
}
return writer.ToString();
}
답변
나는 이것이 오래되고 답이 있다는 것을 알고 있지만 여기에 다른 방법이 있습니다. 특히 문자열 시작 부분에 UTF8 BOM을 원하지 않고 텍스트를 들여 쓰고 싶은 경우 :
using (var ms = new MemoryStream())
using (var x = new XmlTextWriter(ms, new UTF8Encoding(false))
{ Formatting = Formatting.Indented })
{
// ...
return Encoding.UTF8.GetString(ms.ToArray());
}
답변
사용 StringBuilder
:
var sb = new StringBuilder();
using (XmlWriter xmlWriter = XmlWriter.Create(sb))
{
...
}
return sb.ToString();
답변
사람들은 xmlWriter.Close () 및 xmlWriter.Dispose ()를 호출하는 것을 잊지 마십시오. 그렇지 않으면 문자열 생성이 완료되지 않습니다. 빈 문자열이됩니다.
답변
여기서 가장 간단하고 빠른 해결책은 다음과 같습니다.
StringBuilder sb = new StringBuilder();
using (var writer = XmlWriter.Create(sb, settings))
{
... // Whatever code you have/need :)
sb = sb.Replace("encoding=\"utf-16\"", "encoding=\"utf-8\""); //Or whatever uft you want/use.
//Before you finally save it:
File.WriteAllText("path\\dataName.xml", sb.ToString());
}