2010-05-04 58 views

回答

19

这是一个黑客十岁上下的方式做到这一点,而无需将整个输出字符串加载到如下:

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()); 
    } 
} 
+0

+1 - 我不认为它真的很骇人。也许更多的工作比我想要做的更多。但最后,它告诉它在输出之前输出的格式是什么。这不是黑客。一个黑客将是事后等剥离一切。 – 2010-06-18 21:07:27

+1

我同意安德鲁,这是hackish。除非我做错了什么,否则我所有的元素都有属性'xmlns =“”'。本来希望这根本不存在。 – 2011-03-15 21:06:35

+0

**没有XmlDocument/XmlNode操作** – Kiquenet 2017-02-14 14:09:37

-2
+2

不会。这会生成一个有效的xml文档,其中包含XML声明和名称空间引用。我只想要一个片段。 – Emmanuel 2010-05-04 19:49:40

+0

恕我直言,更好的删除答案,因为对于这个问题无效。 http://stackoverflow.com/help/how-to-answer – Kiquenet 2017-03-06 08:20:22

1

你应该能够只是像序列化你平时做什么,然后从得到的文档使用Root属性。

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

+1

+1听起来不错,但我没有在我的问题中解释的是,我宁愿产生一个流而不是XmlDocument。 – Emmanuel 2010-05-05 10:06:35

0

通过这真棒的方式。 我实现了这个代码,可以很容易地将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>(); 
    } 

再次感谢这个非常有用的代码。

+1

有问题我立即尝试在我自己的项目中。使用正确命名的文本片段(如我提供的示例),代码完美运行。我有一个没有和根元素名称相同的类名。答案是简单地在该类中添加XmlRootAttribute,并将其命名为xml中根元素的名称。这工作没有缺陷。您也可以放心,xmldocument中存在的所有未在类定义中表示的元素都不会破坏解析。 – jwize 2011-12-16 10:30:50