【问题标题】:Can the XML serialiser be altered to not output the XML version?可以将 XML 序列化程序更改为不输出 XML 版本吗?
【发布时间】:2015-04-21 16:42:28
【问题描述】:

我正在使用以下代码将多个类序列化为 XML 文件

static void GetFromDBToXml()
    {
        var thejob = Xmltodb.Singleton.DBManager.GetSingleObject<job>("jobid", JobData.Job.Jobid);
        var theparts = Xmltodb.Singleton.DBManager.GetListOfObjects<parts>("jobid", JobData.Job.Jobid);
        var thesurv = Xmltodb.Singleton.DBManager.GetListOfObjects<jobsurvey>("jobid", JobData.Job.Jobid);

        try
        {
            using (var fs = new FileStream(Path.Combine(Xmltodb.Singleton.ContentDirectory, "temp.xml"), FileMode.OpenOrCreate))
            {
                var xmlSerializer = new XmlSerializer(typeof(job));
                xmlSerializer.Serialize(fs, thejob);
                xmlSerializer = new XmlSerializer(typeof(parts));
                foreach (var p in theparts)
                    xmlSerializer.Serialize(fs, p);
                xmlSerializer = new XmlSerializer(typeof(jobsurvey));
                foreach (var s in thesurv)
                    xmlSerializer.Serialize(fs, s);
            }
        }
        catch (InvalidOperationException ex)
        {
            Console.WriteLine("Can't write the xml file : {0}--{1}", ex.Message, ex.StackTrace);
        }
    }

代码直接从 SQLite 中提取并写入 XML 文件。

虽然这可行,但在每个类的末尾和下一个类的开始,我每次都会添加 XML 标头。换句话说

</jobsurvey>
<?xml version="1.0" encoding="utf-8">
<parts xmlns:xsi="http://www.w3.org ...

有没有办法防止序列化程序为每个正在序列化的类生成 &lt;?xmlxmlns: 部分,而无需创建文件,然后重新解析以删除我不需要的这些位?

【问题讨论】:

  • 您应该输出有效的 xml。有效的 xml 在顶部有一个 xml 版本,并且只有一个根元素。你违反了两者。解决方案通常是创建一个代表 xml 根的类型,为每个工作、部件和工作调查添加一个属性,设置它们,然后序列化这个实例。
  • 使用 OmitXmlDeclarations =true 进行设置,如 stackoverflow.com/questions/1772004/…

标签: c# xml


【解决方案1】:

你可以试试这样的。 这里重要的是 XMLWriterSettings 和 XmlSerializerNamespaces。

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;

MemoryStream ms = new MemoryStream();
XmlWriter writer = XmlWriter.Create(ms, settings);

XmlSerializerNamespaces names = new XmlSerializerNamespaces();
names.Add("", "");

XmlSerializer cs = new XmlSerializer(typeof(Cat));

cs.Serialize(writer, new Cat { Lives = 9 }, names);

ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
var xml = sr.ReadToEnd();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-31
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多