.net 序列化为XML片段,而不是XML文档
如何将XML可序列化对象序列化为XML片段(根元素中没有XML声明或命名空间引用)?您应该能够像通常那样进行序列化,然后使用结果文档中的.net 序列化为XML片段,而不是XML文档,.net,xml,xml-serialization,.net,Xml,Xml Serialization,如何将XML可序列化对象序列化为XML片段(根元素中没有XML声明或命名空间引用)?您应该能够像通常那样进行序列化,然后使用结果文档中的根属性 您可能需要先清除元素的属性。下面是一种不必将整个输出字符串加载到XmlDocument中的黑客方法: 使用系统; 使用系统文本; 使用System.Xml; 使用System.Xml.Serialization; 公开课范例 { 公共字符串名称{get;set;} 静态void Main() { 示例=新示例{Name=“Foo”}; XmlSerial
根属性
您可能需要先清除元素的属性。下面是一种不必将整个输出字符串加载到XmlDocument中的黑客方法:
使用系统;
使用系统文本;
使用System.Xml;
使用System.Xml.Serialization;
公开课范例
{
公共字符串名称{get;set;}
静态void Main()
{
示例=新示例{Name=“Foo”};
XmlSerializer serializer=新的XmlSerializer(typeof(示例));
XmlSerializerNamespaces emptyNamespace=新的XmlSerializerNamespaces();
添加(String.Empty,String.Empty);
StringBuilder输出=新的StringBuilder();
XmlWriter=XmlWriter.Create(输出,
新的XmlWriterSettings{OmitXmlDeclaration=true});
serializer.Serialize(writer,例如,emptyNamespace);
Console.WriteLine(output.ToString());
}
}
顺便说一句,这太棒了。
我实现了这段代码,以便于快速地将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;
}
}
现在,您所要做的就是修饰任何可序列化的类,您希望使用接口将其转换为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>();
}
static void Main(字符串[]args)
{
var someSerializableClassObj=新的SomeSerializableClass(){SomeData=“Testing”};
var element=someSerializableClass.ToElement();
var backToSomeSerializableClassObj=element.ToObject();
}
再次感谢这段非常有用的代码 +1对我来说听起来不错,但我在问题中没有解释的是,我更喜欢生成流而不是XmlDocument。+1-我认为这一点都不太粗糙。可能比我想做的还要多。但是,在最后,它告诉它在工作之前输出应该是什么格式。那不是黑客。黑客就是在事后把所有的东西都去掉。我同意安德鲁的观点,这是黑客行为。除非我做错了什么,否则我的所有元素都具有属性“xmlns=”“”。我希望这一点都不存在。在我自己的项目中尝试这一点时,我立即遇到了一个问题。使用一个完全遵循正确命名的文本片段(如我提供的示例中所示),代码工作得非常好。我的类名与根元素的名称不同。答案是简单地在类上添加XmlRootAttribute,并将其命名为与xml中根元素的名称相同的名称。这项工作毫无瑕疵。您还可以确信,xmldocument中存在的任何未在类定义中表示的元素都不会中断解析。
static void Main(string[] args)
{
var someSerializableClassObj = new SomeSerializableClass() {SomeData = "Testing"};
var element = someSerializableClass.ToElement();
var backToSomeSerializableClassObj = element.ToObject<SomeSerializableClass>();
}