1

エンティティのリストを含む次のXMLがあります。

<?xml version="1.0" encoding="utf-8" ?>
<Connections>
  <Connection>
    <ConnectionName>connName</ConnectionName>
    <InterfaceName>Account Lookup</InterfaceName>
    <RequestFolder>C:\Documents and Settings\user\Desktop\Requests</RequestFolder>
    <ResponseFolder>C:\Documents and Settings\user\Desktop\Responses</ResponseFolder>
  </Connection>
</Connections>

名前に基づいてそのうちの1つを取得し、そこからオブジェクトを構築しようとしています。

var results = (from i in this.Elements("Connection")
                           where i.Element("ConnectionName").ToString() == stubConnectionName
                           select new {
                               interfaceName = ((string)i.Element("InterfaceName").Value),
                               requestFolder = ((string)i.Element("RequestFolder").Value),
                               responseFolder = ((string)i.Element("ResponseFolder").Value),
                           }).Single();

return new StubConnection(stubConnectionName, results.interfaceName, results.requestFolder, results.responseFolder);

問題は、結果が空に戻ることです。私のクエリの何が問題になっていますか?

4

1 に答える 1

6
where i.Element("ConnectionName").ToString() == stubConnectionName

である必要があります:

where i.Element("ConnectionName").Value == stubConnectionName

XMLタグを含めて返さXElement.ToStringれますが、タグなしで囲まれた接続名のみが返されるためです。<ConnectionName>connName</ConnectionName>XElement.Value

ちなみに、あなたは不必要にすべての値(すでにタイプになっているstring)をにキャストしていますstring。あなたはそれを単純化することができます:

var results = (from i in this.Elements("Connection")
               where i.Element("ConnectionName").Value == stubConnectionName
               select new
               {
                   interfaceName = i.Element("InterfaceName").Value,
                   requestFolder = i.Element("RequestFolder").Value,
                   responseFolder = i.Element("ResponseFolder").Value,
               }).Single();

さらに一歩進んで、間に匿名タイプを使用せずに、結果を直接選択して返すこともできます。

return (from i in this.Elements("Connection")
        where i.Element("ConnectionName").Value == stubConnectionName
        select new StubConnection(stubConnectionName,
                                  i.Element("InterfaceName").Value,
                                  i.Element("RequestFolder").Value,
                                  i.Element("ResponseFolder").Value)).Single();

の違いもご理解ください

XElement.Value vs (string)XElement

要素に値が含まれていない場合は例外がスローされるため、Valueプロパティを直接呼び出す場合は注意が必要です。 値が含まれるかどうかわからない場合は、要素ではなく、直接)を文字列にキャストします。 そうでない場合は、nullが返されます。それ以外の場合、結果は同じです。ValueXElement

于 2012-09-11T14:57:19.207 に答える