我有这个包含实体列表的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);
问题是结果是空的。我的查询出了什么问题?
答案 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;否则,结果是一样的。