1

XML文字列から選択リストを取得しようとしています...

<?xml version="1.0" encoding="utf-8"?>
<selectListItemDefinition id="UPMCTypes">
  <item key="bla1" value="bla" />
  <item key="bla2" value="bla" />
  <item key="bla3" value="bla" />
  <item key="bla4" value="bla" />
  <item key="bla5" value="bla" />
  <item key="bla6" value="bla" />
  <item key="bla7" value="bla" />
  <item key="bla8" value="bla" />
  <item key="bla9" value="bla" />
  <item key="bla10" value="bla" />
  <item key="bla11" value="bla" />
</selectListItemDefinition>

これが、私がSelectListに変換しようとしているXML文字列になります。これが私がそれを実行しようとしている方法です...

List<SelectListItem> SListItem =
(
    from xmlSList in xDoc.Descendants("selectListItemDefinition")
    let listItem = xmlSList.Elements("item")
    select new SelectListItem
    {
        Key = xmlSList.Attribute("key").Value,
        Value = xmlSList.Attribute("value").Value
    }
).ToList();

これは、私にとって最初のKey-Valueのものだけを取得します。

Key    "blah1"  string
Value  "blah"   string

ここで要素を1つしか取得していないからだと思いますか?しかし、これを正しくするために私が何をするかはわかりません。

4

1 に答える 1

4

例外が発生するはずなので、クエリに問題があると思います。

の属性「キー」と「値」を選択しようとしていますが<selectListItemDefinition>、存在しません。そして、実際にはlistItemselect句で使用していません。

最初の行は、IEnumerable<XElement>「selectListItemDefinition」と呼ばれるすべてのノードを返しています。2行目はそれを取り、IEnumerable<>「item」という子要素を変数namedに割り当てていますlistItem

行う必要があるのは、<selectListItemDefinition>要素を割り当てるのではなく、要素を反復処理する 2 番目のクエリです。

したがって、に置き換えるlet listItem = xmlSList.Elements("item")from listItem in xmlSList.Elements("item")、期待どおりに動作するはずです。

完全なクエリは次のようになります。

var SListItem = 
                (
                    from xmlSList in xDoc.Descendants("selectListItemDefinition")
                    from listItem in xmlSList.Elements("item")
                    select new SelectListItem
                    {
                        Key = listItem .Attribute("key").Value,
                        Value = listItem .Attribute("value").Value
                    }
                ).ToList();

また、XML ドキュメントで呼び出される要素だけが目的の要素であることが 100% 確実<item>な場合は、1 行目と 2 行目を 1 行に置き換えるだけでfrom listItem in xDoc.Descendants("item")、同じ動作が得られます。

于 2012-05-30T19:47:44.567 に答える