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>

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

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

因为XElement.ToString返回<ConnectionName>connName</ConnectionName>包括 XML 标记,而XElement.Value只返回不带标记的封闭连接名称。

顺便说一句,您不必要地将所有值(已经是 type 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 对比 (string)XElement

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

于 2012-09-11T14:57:19.207 回答