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

Yoa*_*oav 1 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>
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据其名称检索其中一个并从中构建一个对象.

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);
Run Code Online (Sandbox Code Playgroud)

问题是结果是空的.我的查询有什么问题?

Ada*_*dam 6

where i.Element("ConnectionName").ToString() == stubConnectionName
Run Code Online (Sandbox Code Playgroud)

必须:

where i.Element("ConnectionName").Value == stubConnectionName
Run Code Online (Sandbox Code Playgroud)

因为XElement.ToString返回<ConnectionName>connName</ConnectionName>包括XML标记,而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();
Run Code Online (Sandbox Code Playgroud)

您甚至可以更进一步直接选择并返回结果,而不使用之间的匿名类型:

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();
Run Code Online (Sandbox Code Playgroud)

还请了解其中的差异

XElement.Value VS (string)XElement

直接调用Value属性时要小心,因为如果元素不包含任何值,它将抛出异常. 如果您不确定它是否包含值,请将元素 (不是Value,但XElement直接)转换为字符串.如果没有,则返回null; 否则,结果是一样的.