XmlWriter to Write to a String Instead of to a File

前端 未结 6 2000
星月不相逢
星月不相逢 2020-11-27 03:59

I have a WCF service that needs to return a string of XML. But it seems like the writer only wants to build up a file, not a string. I tried:

string nextXM         


        
相关标签:
6条回答
  • 2020-11-27 04:23

    You need to create a StringWriter, and pass that to the XmlWriter.

    The string overload of the XmlWriter.Create is for a filename.

    E.g.

    using (var sw = new StringWriter()) {
      using (var xw = XmlWriter.Create(sw)) {
        // Build Xml with xw.
    
    
      }
      return sw.ToString();
    }
    
    0 讨论(0)
  • 2020-11-27 04:24

    Use StringBuilder:

    var sb = new StringBuilder();
        using (XmlWriter xmlWriter = XmlWriter.Create(sb))
        {
            ...
        }
    return sb.ToString();
    
    0 讨论(0)
  • 2020-11-27 04:31

    As Richard said, StringWriter is the way forward. There's one snag, however: by default, StringWriter will advertise itself as being in UTF-16. Usually XML is in UTF-8. You can fix this by subclassing StringWriter;

    public class Utf8StringWriter : StringWriter
    {
        public override Encoding Encoding
        {
             get { return Encoding.UTF8; }
        }
    }
    

    This will affect the declaration written by XmlWriter. Of course, if you then write the string out elsewhere in binary form, make sure you use an encoding which matches whichever encoding you fix for the StringWriter. (The above code always assumes UTF-8; it's trivial to make a more general version which accepts an encoding in the constructor.)

    You'd then use:

    using (TextWriter writer = new Utf8StringWriter())
    {
        using (XmlWriter xmlWriter = XmlWriter.Create(writer))
        {
            ...
        }
        return writer.ToString();
    }
    
    0 讨论(0)
  • 2020-11-27 04:33

    Well I think the simplest and fastest solution here would be just to:

    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());
    }
    
    0 讨论(0)
  • 2020-11-27 04:35

    I know this is old and answered, but here is another way to do it. Particularly if you don't want the UTF8 BOM at the start of your string and you want the text indented:

    using (var ms = new MemoryStream())
    using (var x = new XmlTextWriter(ms, new UTF8Encoding(false)) 
                       { Formatting = Formatting.Indented })
    {
         // ...
         return Encoding.UTF8.GetString(ms.ToArray());
    }
    
    0 讨论(0)
  • 2020-11-27 04:36

    Guys don't forget to call xmlWriter.Close() and xmlWriter.Dispose() or else your string won't finish creating. It will just be an empty string

    0 讨论(0)
提交回复
热议问题