使用C#导出XML

时间:2012-07-03 08:24:35

标签: c# xml export

我正在尝试从C#

中的某些数据导出xml
XDocument doc = XDocument.Parse(xml);

保存XML后,我发现XML包含

<?xml version="1.0" encoding="utf-8"?>

我根本没有进入,导致如下问题。

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="..\..\dco.xsl"?>
<S>
  <B>
  </B>
</S>

我不希望第一行出现,有什么想法吗? 谢谢你的回复。

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您需要一个没有标题的XML文件。看看this answer

基本上,您需要初始化XmlWriterXmlWriterSettings类,然后致电doc.Save(writer)

答案 1 :(得分:2)

其PI(处理指令)是必需的,包含处理xml文件时使用的重要信息。

在编写xml文件时尝试此操作:

XmlWriter w;
w.Settings = new XmlWriterSettings();
w.Settings.ConformanceLevel = ConformanceLevel.Fragment;
w.Settings.OmitXmlDeclaration = true;

Omitting XML processing instruction when serializing an object

Removing version from xml file

http://en.wikipedia.org/wiki/Processing_Instruction

答案 2 :(得分:1)

你所说的是“AFTER”你用字符串解析,如上所示你的结果包含重复的声明?

现在我不确定你是如何保存你的回复的,但这是一个产生类似结果的示例应用程序。

XDocument doc = XDocument.Parse("<?xml-stylesheet type=\"text/xsl\" href=\"dco.xsl\"?><S><B></B></S>");
            doc.Save(Console.OpenStandardOutput());

产生结果:

<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="dco.xsl"?>
<S>
  <B></B>
</S>

你遇到的问题是什么。您需要在保存之前删除xml声明。这可以通过在保存xml输出时使用xml writer来完成。下面是带有扩展方法的示例应用程序,用于在没有声明的情况下编写新文档。

class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Parse("<?xml-stylesheet type=\"text/xsl\" href=\"dco.xsl\"?><S><B></B></S>");
            doc.SaveWithoutDeclaration(Console.OpenStandardOutput());
            Console.ReadKey();
        }


    }

    internal static class Extensions
    {
        public static void SaveWithoutDeclaration(this XDocument doc, string FileName)
        {
            using(var fs = new StreamWriter(FileName))
            {
                fs.Write(doc.ToString());
            }
        }

        public static void SaveWithoutDeclaration(this XDocument doc, Stream Stream)
        {
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(doc.ToString());
            Stream.Write(bytes, 0, bytes.Length);
        }
    }