파일 대신 문자열에 쓰는 XmlWriter 아닌 파일

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());
}