2016-07-28 4 views
2

属性の名前を削除できませんclsProduct from my xml私はList<clsValues>のために[XmlElement(ElementName = "Values", Type = typeof(clsValues)]を使ってみましたが、私に必要な結果は得られませんでした。C#シリアル化結果から属性名を削除

以下の結果が表示されます。私のシリアライゼーションクラスの

パーツ:

[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; } 
} 

私の現在のXML結果:

<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> 

結果は私が必要:

<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> 

は、誰かが助けることはできますか?

おかげ

編集:

<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

「cls」接頭辞の使用を中止し、通常の.NET命名規則に従うのをやめるのはとても良い時期です。 –

+0

@JonSkeet私は通常、プレフィックスを使用しません。私はそれを拡張しているプロジェクトを作成せず、1つのアプリケーションで2つの命名規則を使用したくありません。 – remarkies

+0

私はあなたの同僚に、命名規則に従うことを提案したいと思います。スタックオーバーフローに関する質問を投稿していることを忘れないでください。同じ正確な問題を示している限り、正確なコードである必要はありません。これは、読者のための注意散漫を減らすために、より簡単で従来のものにすることができるということです。 –

答えて

1

あなたの問題は、このプロパティに関する:

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

含意は、特定のタイプclsValuesを持ってValuesと呼ばれる複数の要素があるです。これらのそれぞれにValueまたはMultiValueの子が1つまたは両方あります。何をしたい

は要素Valuesする配列あると配列項目のためにあなたの二つの異なる要素タイプ間の選択であること - それはどちらかは、Value要素またはMultiValue要素が含まれています。あなたはそれを達成するために、このような構造ができ

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; } 
} 

は、作業のデモ用this fiddleを参照してください。

+0

ありがとうございました。できます! – remarkies

0

てみた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()); 
      } 
     } 
    } 
} 
: 私はこの結果を得る

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

代わりのXmlArrayItemを使用しています

1

XMLは、区切り文字として二<Values></Values>を使用しているためであることがあります

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

を使用する必要があり、それはそのようserializatingされている理由の代わりに

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

私が実装すると、最初と最後のが消えます。 – remarkies

0

理由は、あります。 clsValuesオブジェクトはValueMultiValueのプロパティを同時に設定できるため、これが必要です。その場合は、あなたに必要なフォーマット

<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> 

におけるXMLは、後方Valueセットと間違って両方ValueMultiValueセットで1つのオブジェクト、またはValueセットで1つのオブジェクトとして、Valueと1個のオブジェクトと1つのオブジェクトとして解釈される可能性が正しいものであるMultiValueがセットされた1つのオブジェクト。しかし、XMLパーサーは、どの解釈が正しいかを知ることができません。あなたが知っている限り、あなたのオブジェクトは常に1つのプロパティセットしか持たないでしょう。実装された1つのプロパティルールを持つ独自のSerializatorとDeserializatorを書くことができます。

+0

あなたの投稿を理解する限り、シリアライザはxmlを必要な形式でシリアル化することができません。 – remarkies

関連する問題