C#Linq to XML - 简单查询不返回任何结果

时间:2012-09-11 14:50:29

标签: c# linq-to-xml

我有这个包含实体列表的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);

问题是结果是空的。我的查询出了什么问题?

1 个答案:

答案 0 :(得分:6)

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属性时要小心,因为如果元素不包含值,它将抛出异常。如果您不确定它是否包含值,请Cast the element (不是Value,而是直接XElement。如果没有,则返回null;否则,结果是一样的。