Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 序列化为XML片段,而不是XML文档_.net_Xml_Xml Serialization - Fatal编程技术网

.net 序列化为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

如何将XML可序列化对象序列化为XML片段(根元素中没有XML声明或命名空间引用)?

您应该能够像通常那样进行序列化,然后使用结果文档中的
根属性


您可能需要先清除元素的属性。

下面是一种不必将整个输出字符串加载到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>();
    }