如何序列化XML序列化对象到XML片段(在根元素中没有XML声明或名称空间引用)?序列化成XML片段 - 不是XML文档
回答
这是一个黑客十岁上下的方式做到这一点,而无需将整个输出字符串加载到如下:
using System;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public class Example
{
public String Name { get; set; }
static void Main()
{
Example example = new Example { Name = "Foo" };
XmlSerializer serializer = new XmlSerializer(typeof(Example));
XmlSerializerNamespaces emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
StringBuilder output = new StringBuilder();
XmlWriter writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, example, emptyNamespace);
Console.WriteLine(output.ToString());
}
}
你应该能够只是像序列化你平时做什么,然后从得到的文档使用Root
属性。
您可能需要先清除元素的属性。
+1听起来不错,但我没有在我的问题中解释的是,我宁愿产生一个流而不是XmlDocument。 – Emmanuel 2010-05-05 10:06:35
通过这真棒的方式。 我实现了这个代码,可以很容易地将xml片段作为类快速处理,然后您可以在完成时替换节点。这使得代码和xml之间的转换非常容易。
首先创建一些扩展方法。
public static class SerializableFragmentExtensions
{
public static XElement ToElement(this ISerializableFragment iSerializableFragment)
{
var serializer = new XmlSerializer(iSerializableFragment.GetType());
var emptyNamespace = new XmlSerializerNamespaces();
emptyNamespace.Add(String.Empty, String.Empty);
var output = new StringBuilder();
var writer = XmlWriter.Create(output,
new XmlWriterSettings { OmitXmlDeclaration = true });
serializer.Serialize(writer, iSerializableFragment, emptyNamespace);
return XElement.Parse(output.ToString(), LoadOptions.None);
}
public static T ToObject<T>(this XElement xElement)
{
var serializer = new XmlSerializer(typeof (T));
var reader = xElement.CreateReader();
var obj = (T) serializer.Deserialize(reader);
return obj;
}
}
下实现所需的接口(标记接口 - 我知道你不应该,但我认为这是一个完美的理由吧。)
public interface ISerializableFragment
{
}
现在,所有你需要做的就是装饰任何Serializable类,你想转换为一个XElement片段,与接口。
[Serializable]
public class SomeSerializableClass : ISerializableFragment
{
[XmlAttribute]
public string SomeData { get; set; }
}
最后测试代码。
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}
再次感谢这个非常有用的代码。
有问题我立即尝试在我自己的项目中。使用正确命名的文本片段(如我提供的示例),代码完美运行。我有一个没有和根元素名称相同的类名。答案是简单地在该类中添加XmlRootAttribute,并将其命名为xml中根元素的名称。这工作没有缺陷。您也可以放心,xmldocument中存在的所有未在类定义中表示的元素都不会破坏解析。 – jwize 2011-12-16 10:30:50
- 1. 序列化到XML文档
- 2. 序列化成XML
- 3. XML文档的序列化(System.InvalidOperationException)
- 4. XMLSerializer无法反序列化xml文档
- 5. 序列化到XML文件创建无效的XML文档(11,12)
- 6. 如何序列化对象到XML但又不希望它是XML文档
- 7. C# - 反序列化的XML字符串,有XML文档(1,2)
- 8. XML序列化的C#错误“XML文档(2,2)有错误”
- 9. XML到LINQ反序列化为XML文档中的对象
- 10. 如何将此XML文档反序列化以生成C#类
- 11. 什么是反序列化和序列化xml文档的最快方法?
- 12. 片段XML文件
- 13. 在XmlTextReader对象中读取'假'xml文档(xml片段)
- 14. 使用C#中的Xml文档取消注释XML片段#
- 15. 的XML C#XML序列化
- 16. XML序列化
- 17. XML序列化
- 18. XML序列化
- 19. XML序列化
- 20. XML序列化
- 21. 反序列化XML文件
- 22. 私有字段是否需要序列化xml文件?
- 23. Java:序列化/反序列化到XML /而不是二进制
- 24. XSLT格式化XML文档
- 25. xml序列化导致缺少字段
- 26. 生成随机XML文档
- 27. 从XML生成Excel文档
- 28. C#xml文档生成器
- 29. 转换一个XML文档转换成另一个XML文档
- 30. .NET XML序列化
+1 - 我不认为它真的很骇人。也许更多的工作比我想要做的更多。但最后,它告诉它在输出之前输出的格式是什么。这不是黑客。一个黑客将是事后等剥离一切。 – 2010-06-18 21:07:27
我同意安德鲁,这是hackish。除非我做错了什么,否则我所有的元素都有属性'xmlns =“”'。本来希望这根本不存在。 – 2011-03-15 21:06:35
**没有XmlDocument/XmlNode操作** – Kiquenet 2017-02-14 14:09:37