C# 序列化/反序列化XML时删除根目录

C# 序列化/反序列化XML时删除根目录,c#,.net,xml,C#,.net,Xml,我正在使用XmlReader和XmlWriter类以及XmlSerializer类对一些XML模型进行序列化和反序列化。遗憾的是,XML的格式已超出我的控制范围,其中一个文件要求使用无效格式,如下所示: <?xml version="1.0"?> <some_element>...</some_element> <some_element>...</some_element> <some_element>

我正在使用
XmlReader
XmlWriter
类以及
XmlSerializer
类对一些XML模型进行序列化和反序列化。遗憾的是,XML的格式已超出我的控制范围,其中一个文件要求使用无效格式,如下所示:

<?xml version="1.0"?>

<some_element>...</some_element>
<some_element>...</some_element>
<some_element>...</some_element>
遗憾的是,这会自动写出一个根元素

编辑2:

使用此示例:

var model = new TheInvalidModel
{
    Elements = new List<SomeElement>
    {
        new SomeElement { },
        new SomeElement { },
        new SomeElement { },
    }
};
var serializer = new XmlSerializer(typeof(TheInvalidModel));
var tw = new StringWriter();
serializer.Serialize(tw, model);
Console.WriteLine(tw.ToString());
var模型=新的未验证模型
{
元素=新列表
{
新元素{},
新元素{},
新元素{},
}
};
var serializer=新的XmlSerializer(typeof(TheInvalidModel));
var tw=新的StringWriter();
serializer.Serialize(tw,model);
Console.WriteLine(tw.ToString());
我得到以下输出:

<?xml version="1.0" encoding="utf-16"?>
<TheInvalidModel>
  <SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
  <SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
  <SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
</TheInvalidModel>

但我需要的是:

<?xml version="1.0" encoding="utf-16"?>
<SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
<SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />
<SomeElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" />

您可以使用更手动的方法编写不一致的xml代码

使用此选项,您可以循环SomeElements列表并输出xml。

尝试以下操作:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            StringBuilder builder = new StringBuilder(File.ReadAllText(INPUT_FILENAME));
            StringWriter tw = new StringWriter(builder);
            //fill string writer with existing code
            //I just used input file for testing
            XElement model = XElement.Parse(tw.ToString());

            string ident = "<?xml version=\"1.0\" encoding=\"utf-16\"?>";

            StreamWriter writer = new StreamWriter(OUTPUT_FILENAME);
            writer.WriteLine(ident);
            foreach(XElement someElement in model.Descendants("SomeElement"))
            {
                 writer.WriteLine(someElement);
            }
            writer.Flush();
            writer.Close();


        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Xml;
使用System.Xml.Linq;
使用System.IO;
命名空间控制台应用程序1
{
班级计划
{
常量字符串输入\u文件名=@“c:\temp\test.xml”;
常量字符串输出\u文件名=@“c:\temp\test1.xml”;
静态void Main(字符串[]参数)
{
StringBuilder=新的StringBuilder(File.ReadAllText(输入文件名));
StringWriter tw=新的StringWriter(生成器);
//用现有代码填充字符串编写器
//我只是使用输入文件进行测试
XElement model=XElement.Parse(tw.ToString());
字符串标识符=”;
StreamWriter writer=新StreamWriter(输出文件名);
writer.WriteLine(ident);
foreach(model.substands中的XElement someElement(“someElement”))
{
writer.WriteLine(someElement);
}
writer.Flush();
writer.Close();
}
}
}

请与我们分享您的代码tried@PavelAnikhouski Added@PeterLenkefi如果可以,还可以添加一些您尝试的代码的示例输出。@Sommen还添加了当您没有格式良好的xml文件(根上有多个节点)时,最简单的解析方法是添加根:string xml=“”+xml_file_string+”;我想这意味着我可以告别
IXmlSerializable
,因为这现在需要自定义处理?这种变化基本上会波及到所有内容。@PeterLenkefi我试着在WriteToXml中这样做,就像你的问题一样,但不管你做什么,它都会为模型生成一个根标记。所以,是的,像这样的事情是我唯一能想到的。也许你仍然可以使用正确的普通编写器,并进行一些后期处理?所以你仍然会使用IXmlSerializable,你序列化了这个东西,然后就在你写文件之前(或者之后编辑文件),你操作了数据?也许不是最漂亮的,但是你不必改变你目前的方法。请记住,你无论如何都在写无效的xml,所以你需要在某个时候做一些奇怪的事情。谢谢你的建议,两个答案对我都很有用,我只是不得不接受一个。无论如何谢谢你!
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
settings.CloseOutput = false;

// Create the XmlWriter object and write some content.
MemoryStream strm = new MemoryStream();
XmlWriter writer = XmlWriter.Create(strm, settings);
writer.WriteElementString("orderID", "1-456-ab");
writer.WriteElementString("orderID", "2-36-00a");
writer.Flush();
writer.Close();

// Do additional processing on the stream.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            StringBuilder builder = new StringBuilder(File.ReadAllText(INPUT_FILENAME));
            StringWriter tw = new StringWriter(builder);
            //fill string writer with existing code
            //I just used input file for testing
            XElement model = XElement.Parse(tw.ToString());

            string ident = "<?xml version=\"1.0\" encoding=\"utf-16\"?>";

            StreamWriter writer = new StreamWriter(OUTPUT_FILENAME);
            writer.WriteLine(ident);
            foreach(XElement someElement in model.Descendants("SomeElement"))
            {
                 writer.WriteLine(someElement);
            }
            writer.Flush();
            writer.Close();


        }
    }
}