XmlWriter 到字符串和文件

XmlWriter to both String and File

我可以使用 XmlWriter 向 文件和字符串写入吗?

写入文件时我这样做:

using (var xw = XmlWriter.Create("myFile.xml"))
{
    //Build the xml
} 

当写入字符串时,我这样做:

using (var sw = new StringWriter())
{
    using (var xw = XmlWriter.Create(sw))
    {
        // Build the xml
    }
    return sw.ToString();
}

但是我可以使用相同的 XmlWriter 实例写入文件和字符串吗?

您可以创建这样的方法:

private static void WriteXML(TextWriter writer)
{
    using (var xw = XmlWriter.Create(writer))
    {
        // Build the xml
    }
}

然后这样称呼它:

using (StreamWriter sw = new StreamWriter(...))
    WriteXML(sw);

写入文件或

string xml = String.Empty;
using (StringWriter sw = new StringWriter())
{
    WriteXML(sw);
    xml = sw.ToString();
}

创建字符串。

您甚至可以创建辅助方法:

private static void WriteXMLFile(string fileName)
{
    using (StreamWriter sw = new StreamWriter(...))
        WriteXML(sw);
}

private static string GetXML()
{
    using (StringWriter sw = new StringWriter())
    {
        WriteXML(sw);
        return sw.ToString();
    }
}

创建一个 composite XmlWriter 来包装许多 XmlWriter 个实例。

public class CompositeXmlWriter : XmlWriter
{
    private readonly IEnumerable<XmlWriter> writers;
    public CompositeXmlWriter(IEnumerable<XmlWriter> writers)
    {
        this.writers = writers;
    }

    public override void WriteStartDocument()
    {
        foreach (var writer in writers)
        {
            writer.WriteStartDocument();
        }
    }

    public override void WriteEndDocument()
    {
        foreach (var writer in writers)
        {
            writer.WriteEndDocument();
        }
    }

    ...Implement all other methods
}

使用其他 XmlWriters 创建您的 CompositeXmlWriter

using (var xw = new CompositeXmlWriter(new[] { XmlWriter.Create("myFile.xml"), XmlWriter.Create(new StringWriter())})
{
    //Build the xml
}

现在 xw 中写入的任何内容都将写入所有 XmlWriters。