簡體   English   中英

C#Linq to XML-簡單查詢不返回結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM