2016-11-03 1 views
1

Ich bin eine Reihe von US-Staaten in XML serialisieren, und während ich die Namen der meisten Ausgabeelemente mit Attributen steuern kann, wird der Stammknoten immer "ArrayOfStates" genannt. Gibt es eine Möglichkeit dies zu ändern, so dass es nur "Staaten" sind?Wie benenne ich den Stammknoten beim Serialisieren einer Liste <object> in XML in XML um?

Code:

public class Program 
    { 
     [XmlArray("States")] 
     public static List<State> States; 

     public static void Main(string[] args) 
     { 
      PopulateListOfStates(); 

      var xml = new XmlSerializer(typeof(List<State>)); 
      xml.Serialize(new XmlTextWriter(@"C:\output.xml",Encoding.Default), States); 
     } 
    } 

    public struct State 
    { 
     [XmlAttribute] 
     public string Name; 

     [XmlArray("Neighbours")] 
     [XmlArrayItem("Neighbour")] 
     public List<string> Neighbours; 
    } 

Output:

<?xml version="1.0" encoding="Windows-1252"?> 
<ArrayOfState xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <State Name="AL"> 
     <Neighbours> 
      <Neighbour>FL</Neighbour> 
      <Neighbour>GA</Neighbour> 
      <Neighbour>MS</Neighbour> 
      <Neighbour>TN</Neighbour> 
     </Neighbours> 
    </State> 
    <State Name="FL"> 
     <Neighbours> 
      <Neighbour>AL</Neighbour> 
      <Neighbour>GA</Neighbour> 
     </Neighbours> 
    </State> 
    <State Name="GA"> 
     <Neighbours> 
      <Neighbour>AL</Neighbour> 
      <Neighbour>FL</Neighbour> 
      <Neighbour>NC</Neighbour> 
      <Neighbour>SC</Neighbour> 
      <Neighbour>TN</Neighbour> 
     </Neighbours> 
    </State> 
    ... 
</ArrayOfState> 

Als Nebenwirkung ist es auch möglich, die Inhalte der "Nachbar" Elemente als Attribute dieser Elemente zu haben (d.h. <Neighbour name="XX"/>)?

+0

Erstellen Sie ein Wrapper-Root-Objekt wie in dieser Antwort: [XML-Datei richtig C# Linq lesen] (https://stackoverflow.com/questions/40391131/read-xml-file-properly-c-sharp-linq/40391198 # 40391198). Oder überschreiben Sie den Namen des Root-Elements wie in [diese Antwort] (https://stackoverflow.com/questions/1624540/how-to-set-root-node-name-when-xmlserializing-an-array/1624569#1624569)). Aber wenn Sie die zweite Antwort verwenden, müssen Sie den Serialisierer in einer statischen Zwischenablage zwischenspeichern, wie es [hier] erklärt wird (https://stackoverflow.com/questions/23897145/memory-leak-using-streamreader-and-xmlserializer/). – dbc

Antwort

0
[Serializable] 
public class Worksheet 
{ 
    [XmlRoot(ElementName = "XML")] 
    public class XML 
    { 
     [XmlArray("States")] 
     public List<State> States { get; set; } 
    } 

    public class State 
    { 
     [XmlAttribute] 
     public string Name { get; set; } 

     [XmlArray("Neighbours")] 
     [XmlArrayItem("Neighbour")] 
     public List<Neighbour> Neighbours { get; set; } 
    } 

    public class Neighbour 
    { 
     [XmlAttribute] 
     public string Name { get; set; } 
    } 
} 

public static void Main(string[] args) 
{ 
    Worksheet.XML xml = PopulateListOfStates(); 

    XmlSerializer serializer = new XmlSerializer(typeof(Worksheet.XML)); 
    using (StreamWriter writer = new StreamWriter(@"C:\output.xml", false)) 
    { 
     serializer.Serialize(writer, xml); 
    } 
} 
Verwandte Themen