[英]C# Linq to XML - simple query returns no results
我有一個包含實體列表的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>
我試圖根據其名稱檢索其中之一,並從中構建一個對象。
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);
問題是結果返回為空。 我的查詢出了什么問題?
where i.Element("ConnectionName").ToString() == stubConnectionName
必須:
where i.Element("ConnectionName").Value == stubConnectionName
因為XElement.ToString
返回包含XML標記的<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屬性時要小心,因為如果元素不包含任何值,它將拋出Exception。 如果不確定元素是否包含Value
, 則將元素 (不是Value
,而是直接將XElement
) 強制轉換為字符串。 如果沒有,將返回null;否則返回null。 否則,結果是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.