2016-07-28 31 views
2

Ich bin nicht in der Lage, den Namen des Attributs Werte in clsProduct von meinem Xml zu entfernen. Ich habe versucht, [XmlElement(ElementName = "Values", Type = typeof(clsValues)] für meine List<clsValues>, aber es gab mir nicht das Ergebnis, das ich brauche.C# Serialisierung Entfernen Attributname aus Ergebnis

Sie können das Ergebnis sehen, das ich unten benötige.

Teile meiner Serialisierung Klasse:

[Serializable] 
public class clsProduct 
{ 
    [XmlAttribute("ID")] 
    public string ID { get; set; } 

    [XmlAttribute("UserTypeID")] 
    public string UserTypeID { get; set; } 

    [XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))] 
    public List<clsValues> Values { get; set; } 

} 

[Serializable] 
public class clsValues 
{ 
    [XmlElement(ElementName = "Value")] 
    public clsValue Value { get; set; } 

    [XmlArray(ElementName = "MultiValue"), 
    XmlArrayItem(ElementName = "Value")] 
    public List<clsValue> MultiValue { get; set; } 
} 

[Serializable] 
public class clsValue 
{ 
    [XmlAttribute("AttributeID")] 
    public string AttributeID { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

Mein aktuelles xml Ergebnis:

<Product ID="PROD-01111010" UserTypeID="Product"> 
    <Values> 
    <Values> 
     <Value AttributeID="ATTR-7196">201607280755</Value> 
    </Values> 
    <Values> 
     <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value> 
    </Values> 
    <Values> 
     <MultiValue> 
      <Value>PLATTE</Value> 
      <Value>LUBRIFLON 225</Value> 
      <Value>PLAQUE</Value> 
      <Value>LUBRIFLON 22</Value> 
     </MultiValue> 
    </Values> 
    </Values> 
</Product> 

Ergebnis ich brauche:

<Product ID="PROD-01111010" UserTypeID="Product"> 
    <Values> 
    <Value AttributeID="ATTR-7196">201607280755</Value> 
    <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value> 
    <MultiValue> 
     <Value>PLATTE</Value> 
     <Value>LUBRIFLON 225</Value> 
     <Value>PLAQUE</Value> 
     <Value>LUBRIFLON 22</Value> 
    </MultiValue> 
    </Values> 
</Product> 

Kann jemand helfen?

Dank

Edit: Wenn ich verwende

[XmlElement(ElementName = "Values", Type = typeof(clsValues))] public List<clsValues> Values { get; set; }

statt XmlArrayItem ich dieses Ergebnis:

<Product ID="PROD-01111010" UserTypeID="Product"> 
    <Values> 
     <Value AttributeID="ATTR-7196">201607280755</Value> 
    </Values> 
    <Values> 
     <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value> 
    </Values> 
    <Values> 
     <MultiValue> 
      <Value>PLATTE</Value> 
      <Value>LUBRIFLON 225</Value> 
      <Value>PLAQUE</Value> 
      <Value>LUBRIFLON 22</Value> 
     </MultiValue> 
    </Values> 
</Product> 
+1

Als eine Randnotiz wäre es jetzt eine sehr gute Zeit, das 'cls'-Präfix nicht mehr zu verwenden und den normalen .NET-Namenskonventionen zu folgen. –

+0

@JonSkeet Normalerweise verwende ich keine Präfixe. Ich habe das Projekt nicht erstellt, ich erweitere es und möchte nicht zwei Namenskonventionen in einer Anwendung haben. – remarkies

+0

Nun, ich würde Ihren Kollegen vorschlagen, dass sie dann den Namenskonventionen folgen - und vergessen Sie nicht, dass Sie eine Stack-Overflow-Frage stellen. es muss nicht der genaue Code sein, solange es genau das gleiche Problem zeigt. Das bedeutet, dass Sie es einfacher und konventioneller gestalten können, um Leser weniger abzulenken. –

Antwort

1

Ihre Frage bezieht sich auf diese Eigenschaft:

[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))] 
public List<clsValues> Values { get; set; } 

Die Implikation ist, gibt es mehrere Elemente Values genannt, die einen bestimmten Typ clsValues haben. Und jeder von diesen hat einen oder beide Value oder MultiValue Kinder.

Was Sie wollen, ist das Array ein Element Values und für die Array-Elemente zu sein eine Wahl zwischen zwei verschiedenen Elementtypen zu sein - es enthält entweder ein Value Element oder ein MultiValue Element.

Sie mögen diese Struktur kann das erreichen:

public class Product 
{ 
    [XmlAttribute("ID")] 
    public string Id { get; set; } 

    [XmlAttribute("UserTypeID")] 
    public string UserTypeId { get; set; } 

    [XmlArray("Values")] 
    [XmlArrayItem("Value", typeof(Value))] 
    [XmlArrayItem("MultiValue", typeof(MultiValue))] 
    public List<object> Values { get; set; } 
} 

public class MultiValue 
{ 
    [XmlElement(ElementName = "Value")] 
    public List<Value> Values { get; set; } 
} 

public class Value 
{ 
    [XmlAttribute("AttributeID")] 
    public string AttributeId { get; set; } 

    [XmlText] 
    public string Text { get; set; } 
} 

Siehe this fiddle für eine funktionierende Demo.

+0

Vielen Dank. Es klappt! – remarkies

0

Try xml linq

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

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 
      XDocument doc = XDocument.Load(FILENAME); 

      XElement values = doc.Descendants("Values").FirstOrDefault(); 
      List<XElement> elements = values.Elements().ToList(); 
      for (int index = elements.Count() - 1; index >= 0; index--) 
      { 
       elements[index].ReplaceWith(elements[index].Elements()); 
      } 
     } 
    } 
} 
1

Mai werden Sie

[XmlElement(ElementName = "Values", Type = typeof(clsValues))] 
public List<clsValues> Values { get; set; } 

Statt

[XmlArrayItem(ElementName = "Values", Type = typeof(clsValues))] 
+0

Wenn ich implementiere, verschwindet die erste und letzte . – remarkies

0

Grund verwenden sollte, warum es so serializating, ist, weil XML zweite <Values></Values> als Trennzeichen verwendet. Es wird benötigt, da Ihr clsValues-Objekt die Eigenschaften Value und MultiValue gleichzeitig festlegen kann. In diesem Fall XML in Ihrem benötigten Format

<Product ID="PROD-01111010" UserTypeID="Product"> 
    <Values> 
    <Value AttributeID="ATTR-7196">201607280755</Value> 
    <Value AttributeID="ATTR-6236">PTFE 125 + 25% GF, Platte</Value> 
    <MultiValue> 
     <Value>PLATTE</Value> 
     <Value>LUBRIFLON 225</Value> 
     <Value>PLAQUE</Value> 
     <Value>LUBRIFLON 22</Value> 
    </MultiValue> 
    </Values> 
</Product> 

rückwärts als 1 Objekt mit Value Satz und 1 Objekt mit beide Value und MultiValue Satz interpretiert werden könnte, was falsch ist, oder als ein Objekt mit Value-Set, 1 Objekt mit Value Set und 1 Objekt mit MultiValue Set, das ist richtig. Aber der XML-Parser kann nicht wissen, welche Interpretation richtig ist. Wenn Sie sicher wissen, dass Ihr Objekt immer nur eine Eigenschaftsmenge hat, können Sie Ihren eigenen Serializator und Deserializator mit implementierter einer Eigenschaftsregel schreiben.

+0

Soweit ich Ihren Beitrag verstehe, ist der Serializer nicht in der Lage, ein XML in meinem benötigten Format zu serialisieren? – remarkies