2016-04-20 7 views
0

Meine Klasse sieht serialisiert wieWie Eigenschaftsnamen und Eigenschaftswert als Attributwert

public class Test 
{ 
    private string name;   
    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    private int age;   
    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    }   
} 

ich die XML-Ergebnis wie wünschen:

<NodeList> 
<Node> 
    <DataNode Key="Name" Value="Tom" /> 
    <DataNode Key="Age" Value="30" /> 
</Node> 
<Node> 
    <DataNode Key="Name" Value="John" /> 
    <DataNode Key="Age" Value="35" /> 
</Node> 
</NodeList> 

ich versucht habe XmlAttribute in der Eigenschaft zu setzen, aber Das Ergebnis ist nicht was ich will. Irgendwelche Vorschläge?

Update: Das ist, was ich bekommen:

<?xml version="1.0" encoding="utf-16"?><Node xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="Allen" Age="28" />

+1

Wo ist Ihr Code, der die Serialisierung durchführt? – auburg

+0

Was ist der XML-Code, den Sie stattdessen erhalten? –

+0

Hallo beide, vielen Dank für Ihre Antwort. Aktualisiert. – Allen4Tech

Antwort

1

empfehle ich Ihnen für Ihre Daten wie diese viel einfacher Ansatz zu verwenden:

[Serializable()] 
public class NodeList { 
    [XmlArray("Node")] 
    [XmlArrayItem("DataNode")] 
    public Test[] Nodes; 
} 

public class Test { 
    [XmlAttribute] 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

Und es verwenden so:

string folderpath = Application.StartupPath + "\\settings"; 
string appSettingsFilename = "testsettings2"; 
if (!Directory.Exists(folderpath)) 
    Directory.CreateDirectory(folderpath); 
string filepath = folderpath + "\\" + appSettingsFilename + ".xml"; 

NodeList nodes = new NodeList(); 
XmlSerializer serializer = new XmlSerializer(typeof(NodeList)); 
TextWriter configWriteFileStream = new StreamWriter(filepath); 

nodes.Nodes = new Test[2] { 
    new Test() { Name = "Tom", Age=30}, 
    new Test() { Name = "John", Age=35} 
}; 

serializer.Serialize(configWriteFileStream, nodes); 
configWriteFileStream.Close(); 

Und Sie werden erhalten:

<?xml version="1.0" encoding="utf-8"?> 
<NodeList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Node> 
    <DataNode Name="Tom" Age="30" /> 
    <DataNode Name="John" Age="35" /> 
    </Node> 
</NodeList> 

aber sagen, dass XML-Datei zu erhalten, wie Sie wollen, sollten Sie eigentlich Ihre Klassen wie folgt erklären (kommentiert):

[Serializable()] 
public class DummyClass2 { 
    [XmlElement("NodeList")] //necessary to indicate that this is an element, otherwise will be considered as array 
    public TestList[] NodeList = null; 
} 

public class TestList { 
    [XmlArray("Node")] //let this be array 
    [XmlArrayItem("DataNode")] 
    public Test[] TestItem { get; set; } 
} 

public class Test { 
    private string key; 
    [XmlAttribute("Key")] 
    public string Key { //declare as Key instead 
     get { return key; } 
     set { key = value; } 
    } 

    private string value2; //cannot be int, must be string to accommodate both "Tom" and "30" 
    [XmlAttribute("Value")] 
    public string Value { //declare as Value instead 
     get { return value2; } 
     set { value2 = value; } 
    } 
} 

Und Sie verwenden es wie folgt:

string folderpath = Application.StartupPath + "\\settings"; 
string appSettingsFilename = "testsettings"; 
if (!Directory.Exists(folderpath)) 
    Directory.CreateDirectory(folderpath); 
string filepath = folderpath + "\\" + appSettingsFilename + ".xml"; 

DummyClass2 dummyClass2 = new DummyClass2(); 
XmlSerializer serializer = new XmlSerializer(typeof(DummyClass2)); 
TextWriter configWriteFileStream = new StreamWriter(filepath); 

dummyClass2.NodeList = new TestList[2] { 
    new TestList() { 
     TestItem = new Test[2] { 
      new Test() { Key="Name", Value="Tom"}, 
      new Test() { Key="Age", Value="30"} 
     } 
    }, 
    new TestList() { 
     TestItem = new Test[2] { 
      new Test() { Key="Name", Value="John"}, 
      new Test() { Key="Age", Value="35"} 
     } 
    } 
}; 

serializer.Serialize(configWriteFileStream, dummyClass2); 
configWriteFileStream.Close(); 

Und Sie sollten erhalten:

<?xml version="1.0" encoding="utf-8"?> 
<DummyClass2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <NodeList> 
    <Node> 
     <DataNode Key="Name" Value="Tom" /> 
     <DataNode Key="Age" Value="30" /> 
    </Node> 
    </NodeList> 
    <NodeList> 
    <Node> 
     <DataNode Key="Name" Value="John" /> 
     <DataNode Key="Age" Value="35" /> 
    </Node> 
    </NodeList> 
</DummyClass2> 
0

Sie brauchen keine Serialisierung. Versuchen Sie diese

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 



namespace ConsoleApplication85 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var inputs = new[] { 
       new { name = "Tom", age = 30}, 
       new { name = "John", age = 35} 
          }; 


      XElement nodeList = new XElement("NodeList"); 
      XElement node = new XElement("Node"); 
      nodeList.Add(node); 

      foreach (var input in inputs) 
      { 
       node.Add(new XElement("DataNode", new XAttribute[] { new XAttribute("Key", input.name), new XAttribute("Value", input.age)})); 
      } 
     } 

    } 

} 
Verwandte Themen