XDocument.CreateWriter使用XmlWriterSettings

时间:2015-03-13 20:01:47

标签: c# xml xmlwriter

我尝试为XDocument创建XMLWriter,并对其应用设置,但我无法弄清楚如何。

这是我到目前为止所拥有的。

        var writerSettings = new XmlWriterSettings()
        {
            OmitXmlDeclaration = true,
            Encoding = Encoding.UTF8
        };
        var request = new XDocument();
        using (var writer = request.CreateWriter())
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("CUSTOMER");
            writer.WriteElementString("ADDRESS", "123 Fake St.");
            writer.WriteElementString("CITY", "San Jose");
            writer.WriteElementString("STATE", "CA");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }

我无法弄清楚如何将writerSettings应用于编写器。 XDocument.CreateWriter()方法不会使用任何参数来指定XMLWriterSettings。并且,在创建之后,“设置”属性没有设置器。

如果没有办法使用CreateWriter()并应用设置,我怎样才能达到相同的效果,最终得到相同的结果?

2 个答案:

答案 0 :(得分:2)

如果您使用XDocument.Save(XmlWriter),则可以创建自己的XmlWriter提供XmlWriterSettings参数,并将XDocument的内容写入其中。

或者,您可以调用其中一个XDocument.ToString overloads,它会从返回的字符串中省略XML声明(如果这是您想要配置的全部内容)。

您的示例在下方更新,以显示两个选项:

using System;
using System.Text;
using System.Xml;
using System.Xml.Linq;

class Program
{
    static void Main(string[] args)
    {
        var request = new XDocument();

        using (var writer = request.CreateWriter())
        {
            writer.WriteStartDocument();
            writer.WriteStartElement("CUSTOMER");
            writer.WriteElementString("ADDRESS", "123 Fake St.");
            writer.WriteElementString("CITY", "San Jose");
            writer.WriteElementString("STATE", "CA");
            writer.WriteEndElement();
            writer.WriteEndDocument();
        }

        // XDocument.ToString() will print:
        //<CUSTOMER>
        //  <ADDRESS>123 Fake St.</ADDRESS>
        //  <CITY>San Jose</CITY>
        //  <STATE>CA</STATE>
        //</CUSTOMER>
        Console.WriteLine(request.ToString());

        // And here's how to use the XmlWriterSettings with XDocument.Save:
        var writerSettings = new XmlWriterSettings()
        {
            OmitXmlDeclaration = true,
            Encoding = Encoding.UTF8
        };

        using (var writer = XmlWriter.Create("test.xml", writerSettings))
        {
            request.Save(writer);
        }

        // The above will write (you could adjust the XmlWriterSettings to add whitespace):
        //<CUSTOMER><ADDRESS>123 Fake St.</ADDRESS><CITY>San Jose</CITY><STATE>CA</STATE></CUSTOMER>
    }
}

或者如果您不使用XDocument的任何其他功能,您可以首先创建自己的XmlWriter实例,然后将节点添加到该实例,并忽略完全XDocument互动。

答案 1 :(得分:0)

或者,使用xmlwriter的静态方法,即create()

using (XmlWriter writer = XmlWriter.Create(filePath, settings))
{ 
//do your thing 
} 

之前我遇到过这个问题并且我同意它不是很明显,尤其是在尝试创建一个新的xmlwriter时。

修改:也可能是How do I set the Settings property in XmlTextWriter, so that I can write each XML attribute on its own line?

的副本

如果您愿意,可以参考以供进一步阅读!