以下に示すようなxmlがあります。
文字列入力(「IsAuthorFilterNeeded」または「IsTitleFilterNeeded」)を受け取り、そのノードの下のブックコード値を返すメソッドを作成する必要があります。
パラメータが「IsAuthorFilterNeeded」の場合、5,6,7,8を返す必要があるとします。
これを取得するためにLinq2XMLクエリを作成しようとしましたが、コードが読み取れず、ハードコードされた文字列が多数あるため、コードに満足できません。これが私のlinq2xmlクエリです。
public IList<string> GetBookCodes(string filterOption)
{
IList<string> requiredValues = null;
foreach (var node in _xml.Descendants("BookOptions"))
{
if (node.Parent.Attribute("Name").Value == "ScienceBooks")
{
var requiredNode = node.Elements("Property").Attributes("Value").First(x => x.Parent.FirstAttribute.Value == filterOption);
requiredValues = requiredNode.Parent.Descendants("BookCode").Attributes("Value").ToArray().Select(x => x.Value).ToList();
break;
}
}
return requiredValues;
}
より単純なコードでこの結果を達成する他の方法はありますか?
<LibraryRack Id="3" Name="ScienceBooks">
<Books>
<Book Id ="1" Name="Book1"></Book>
<Book Id ="2" Name="Book2"></Book >
<Book Id ="3" Name="Book3"></Book>
</Books>
<BookOptions>
<Property Name="IsAuthorFilterNeeded" Value ="1">
<BookCode Value="5" />
<BookCode Value="6" />
<BookCode Value="7" />
<BookCode Value="8" />
</Property>
<Property Name="IsTitleFilterNeeded" Value ="0">
<BookCode Value="2"/>
<BookCode Value="3"/>
<BookCode Value="4"/>
<BookCode Value="7"/>
<BookCode Value="129"/>
</Property>
</BookOptions>
</LibraryRack>