【问题标题】:XDocument.CreateWriter using XmlWriterSettingsXDocument.CreateWriter 使用 XmlWriterSettings
【发布时间】:2015-03-13 20:01:47
【问题描述】:

我正在尝试为 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 应用于 writer。 XDocument.CreateWriter() 方法不使用任何参数来指定 XMLWriterSettings。而且,在创建之后,Settings 属性没有设置器。

如果没有办法使用 CreateWriter() 和应用设置,我还能如何完成等效的事情并最终得到相同的结果?

【问题讨论】:

    标签: c# xml xmlwriter


    【解决方案1】:

    如果您使用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 交互。

    【讨论】:

      【解决方案2】:

      或者,使用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?也可能重复

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-15
        相关资源
        最近更新 更多