2 Stimmen

xml-Auszeichnung für wcf-Wörterbuchtyp reduzieren

Ich entwickle eine WCF-Methode, die Objektdaten zurückgibt, einschließlich einer Dictionary-Eigenschaft. Das XML enthält eine große Menge an Markup und ich frage mich, ob es eine Möglichkeit gibt, das Markup zu reduzieren.

Nachstehend finden Sie ein Beispiel für die aktuelle XML-Ausgabe des Wörterbuchs:

<gases>
 <a:KeyValueOfstringfloat>
  <a:Key>CH4</a:Key> 
  <a:Value>40</a:Value> 
 </a:KeyValueOfstringfloat>
 <a:KeyValueOfstringfloat>
  <a:Key>CO2</a:Key> 
  <a:Value>60</a:Value> 
 </a:KeyValueOfstringfloat>
</gases>

Für jedes zusätzliche Gaselement, das der Sammlung hinzugefügt wird, wird eine zusätzliche <a:KeyValueOfstringfloat> mitsamt seinem Inhalt hinzugefügt. Ist es möglich, die Formatierung auf etwas in der Art von anpassen:

<gases>
 <key>value</key>
</gases>

Vielen Dank im Voraus.

0voto

Sixto Saez Punkte 12515

Es gibt mehrere Möglichkeiten, aber beide beinhalten, dass Sie nicht den Typ .NET Dictionary für Ihre Sammlung verwenden. Angesichts Ihrer gewünschten Ausgabe, sehen Sie sich die akzeptierte Antwort auf diese Frage an.

Andernfalls müssen Sie, wenn Sie einfaches XML wollen, eine einfache Klassenstruktur verwenden. Definieren Sie eine Gase-Klasse, die eine Eigenschaft namens key enthält, die ein Array aus Strings ist. Ich bin mir ziemlich sicher, dass das resultierende Soap-XML wahrscheinlich so aussieht, wie Sie es angezeigt haben.

In beiden Fällen ist es vielleicht nicht das, was Sie wirklich wollen. Ich vermute, dass das Schlüsselelement in der XML-Datei für jedes Schlüssel/Wert-Paar unterschiedlich sein muss, aber Sie sollten in der Lage sein, Ihre Klassen so zu gestalten, dass sie dies handhaben können (erstellen Sie z. B. eine Elementklasse mit String-Eigenschaften für Name und Wert). Wenn Sie mit der Gaseklasse als Wörterbuch arbeiten wollen, müssen Sie dafür Code schreiben.

UPDATE: Hier ein Beispiel dafür, wie konfigurierbar das Attribut CollectionDataContract sein kann:

[CollectionDataContract(
    Name = "Cities",
    ItemName = "city",
    KeyName = "cityName",
    ValueName = "population")]
public class CityList
    : IDictionary<string, int>,
      IEnumerable<System.Collections.Generic.KeyValuePair<string, int>>
{
/// snipped
}

0voto

TheNextman Punkte 12017

Vielleicht nicht genau das, wonach Sie suchen, aber das GZipen der Nachrichten über die Leitung ist sehr hilfreich

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X