2017-11-21 4 views
1
I have an input XML as below: 

<Options> 
<Series> 
    <Series> 
    <Type>Bar</Type> 
    <TargetAxisIndex>1</TargetAxisIndex> 
    </Series> 
    <Series> 
    <Type>Line</Type> 
    <TargetAxisIndex>2</TargetAxisIndex> 
    </Series> 
</Series> 

<Title>Test title</Title> 

</Options> 

私はJsonConvert.SerializeXmlNodeを(使用しています)を使用してJSONにXMLを変換しながらノードとしてインデックス値を持っており、以下のように私の出力を持つようにしたいですこの?基本的には、ノードをインデックスとしてシリアル化する必要があります。はJson.Net

答えて

1

あなたは匿名クラスを介して中間投影を通過し、XmlDocumentからより多くのLINQのフレンドリーXDocumentへの切り替えを気にしない場合、あなたはSelect overload which provides the indexを活用することができ、その後、JSONを取得するために.ToDictionaryを適用させていただきます形以下のものが必要です。

var root = XDocument.Load(pathToMyDocument) 
    .Root; 

var myObject = new 
{ 
    Title = root.Element("Title").Value, 
    Series = root.Element("Series") 
     .Elements("Series") 
     .Select((node, idx) => 
     new 
     { 
      Node = node, 
      Index = idx 
     }) 
     .ToDictionary(
      e => e.Index, 
      e => new 
      { 
       Type = e.Node.Element("Type").Value, 
       TargetAxisIndex = e.Node.Element("TargetAxisIndex").Value 
      }) 
}; 

var json = JsonConvert.SerializeObject(myObject); 

結果:

{ 
    "Title": "Test title", 
    "Series": { 
     "0": { 
      "Type": "Bar", 
      "TargetAxisIndex": "1" 
     }, 
     "1": { 
      "Type": "Line", 
      "TargetAxisIndex": "2" 
     } 
    } 
} 

別の方法としては、辞書を行うこととすることができ、中SerializeXmlNodeを使用する前に、position() functionを使用する前に、XSLTでデクシング操作を行いますが、1を引く必要があります。