2017-05-03 72 views
2

我想产生以下XML:如何在C#中为我的类实现以下XmlSerializer更改?

<Base> 
    <Child> 
     <Name>Joe</Name> 
    </Child> 
    <Child> 
     <Name>Jack</Name> 
    </Child> 
</Base> 

从类:眼下

public class Base 
{ 
    public List<Child> children; 
    ...elided... 
} 

public class Child 
{ 
    public string Name; 
    ...elided... 
} 

,它的创造:

<Base> 
    <children> 
     <Child> 
      <Name>Joe</Name> 
     </Child> 
     <Child> 
      <Name>Jack</Name> 
     </Child> 
    </children> 
</Base> 

我将如何改变以产生所需的输出?

我当前的代码:

XmlSerializer serializer = new XmlSerializer(base.GetType()); 
serializer.serialze(stringWriter, base); 
return stringWriter.ToString(); 

回答

4

使用XmlElementAttribute

public class Base 
{ 
    [XmlElement(ElementName = "Child")] 
    public List<Child> children; 
} 

...完整的例子...

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

class Program 
{ 
    static void Main() 
    { 
     var xsr = new XmlSerializer(typeof(Base)); 

     var b = new Base 
     { 
      children = new List<Child> 
       { 
        new Child { Name= "Joe"}, 
        new Child { Name ="Jack"}, 
       } 
     }; 
     using (var ms = new MemoryStream()) 
     { 
      xsr.Serialize(ms, b); 

      var str = Encoding.UTF8.GetString(ms.ToArray()); 
      /* 
      <?xml version="1.0"?> 
      <Base xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
       <Child> 
       <Name>Joe</Name> 
       </Child> 
       <Child> 
       <Name>Jack</Name> 
       </Child> 
      </Base> 
      */ 
     } 
    } 
} 

public class Base 
{ 
    [XmlElement("Child")] 
    public List<Child> children; 
} 

public class Child 
{ 
    public string Name; 
} 
+0

只需要添加:如果需要进一步推广列表项内的内容,可以将'XmlTextAttribute'应用于'Child'中的属性,以便序列化为:Joe Jack' –

+0

完美, 谢谢! –

0

编辑:其他的解决方案更好,更直接回答你的问题。然而,我要离开这里了这一点,因为扩展列表< >而不是包括公共列表成员可以在某些情况下是个好主意。这是可能的解决方案。

嗯,你可以实现IXmlSerializable的,但可能是矫枉过正你打算做什么。或者,您可以使基本扩展名单<子>。

public class Base : List<Child> 
{ 
} 

这当然会,改变你如何在你的代码的其余部分引用了孩子。如果你有base.children [0],你会改用base [0]。

+0

这是比这更容易。 –

2

您可以使用XmlElementAttribute如下:

public class Base 
{ 
    [XmlElement("Child")] 
    public List<Child> children; 
    ...elided... 
} 

public class Child 
{ 
    public string Name; 
    ...elided... 
} 
相关问题