LINQで列挙するときの通し番号(?)みたいなものはどうやって取ればいいかな
LINQでXML文書を書くとき、要素の属性として「Id = 通し番号」みたいのをくっつけたいんだけど、この通し番号はどうやって取ればいいかわからない。
XDocument doc = XDocument.Load( INPUT_PATH ); XNamespace ksj = "http://nlftp.mlit.go.jp/ksj/schemas/ksj-app"; var plants = new XElement( "Plants", from el in doc.Root.Descendants( ksj + "FC06" ) select new XElement( "Plant", new XAttribute( "Id", 1 ), // ここ! new XElement( "Name", el.Element( ksj + "NPL" ).Value ), new XElement( "Belong", el.Element( ksj + "NOO" ).Value ), new XElement( "PlantNum", el.Element( ksj + "PLN" ).Value ), new XElement( "Address", el.Element( ksj + "AS3" ).Value ), new XElement( "Power", el.Element( ksj + "PRP" ).Value ) ) ); plants.Save( @"plants.xml" );
これをこのまま実行すると、
<?xml version="1.0" encoding="utf-8"?> <Plants> <Plant Id="1"> <Name>川内原子力</Name> <Belong>九州電力</Belong> <PlantNum>2</PlantNum> <Address>鹿児島県川内市</Address> <Power>89000</Power> </Plant> <Plant Id="1"> <Name>川内原子力</Name> <Belong>九州電力</Belong> <!-- 省略 -->
こんな感じで「Id = 1」になっちゃいますよね(new XAttribute( "Id", 1 )って書いてるから仕方ないんだけど)。ここを連番で取りたい。
追記1
id:karuakunさんにコメントいただいた方法。単純にint型の変数をカウンタとして用いるだけ。ふつうにできた(!。
public void Generate() { int index = 0; XDocument doc = XDocument.Load( INPUT_PATH ); XNamespace ksj = "http://nlftp.mlit.go.jp/ksj/schemas/ksj-app"; var plants = new XElement( "Plants", from el in doc.Root.Descendants( ksj + "FC06" ) select new XElement( "Plant", new XAttribute( "Id", index++ ), new XElement( "Name", el.Element( ksj + "NPL" ).Value ), new XElement( "Belong", el.Element( ksj + "NOO" ).Value ), new XElement( "Address", el.Element( ksj + "AS3" ).Value ), new XElement( "PlantNum", el.Element( ksj + "PLN" ).Value ), new XElement( "Power", el.Element( ksj + "PRP" ).Value ) ) ); plants.Save( @"plants2.xml" ); }
<?xml version="1.0" encoding="utf-8"?> <Plants> <Plant Id="0"> <Name>川内原子力</Name> <Belong>九州電力</Belong> <Address>鹿児島県川内市</Address> <PlantNum>2</PlantNum> <Power>89000</Power> </Plant> <Plant Id="1"> <Name>川内原子力</Name> <Belong>九州電力</Belong> <!-- 省略 -->