当元素不存在时返回空白字符串
本文关键字:空白 字符串 返回 元素 不存在 | 更新日期: 2023-09-27 18:32:59
我使用以下查询将XML转换为结构。如果一个元素不存在,我将如何在以下查询中容纳它(ClntCde 将始终存在,但标题可能不存在)
ClientTbl ClientData = clientNode.Select(x => new ClientTbl
{
ClientCode = x.Elements().Where(e => e.Name.LocalName == "ClntCde").FirstOrDefault().Value,
//Title = x.Elements().Where(e => e.Name.LocalName == "Title").ToString(),
//Title = x.Elements().Where(e => e.Name.LocalName == "Title").FirstOrDefault().Value,
//Title = x.Elements("Title").FirstOrDefault().Value,
}
).First();
该 XML:
<Client xmlns="http://www.website.co.za/namespace">
<ClntCde>0000013</ClntCde>
<Surname>Account Holder Surname</Surname>
<Address>
<Addr1>.</Addr1>
<Addr2>.</Addr2>
<Addr3>.</Addr3>
<Addr4>.</Addr4>
<PostCde>2000</PostCde>
</Address>
<ClntAccTyp>A</ClntAccTyp>
<ElecInd>NO</ElecInd>
<Lang>ENG</Lang>
</Client>
您可以使用DefaultIfEmpty("")
:
ClientCode = x.Elements()
.Where(e => e.Name.LocalName == "ClntCde")
.Select(e => e.Value)
.DefaultIfEmpty("")
.First(),
Title = x.Elements()
.Where(e => e.Name.LocalName == "Title")
.Select(e => e.Value)
.DefaultIfEmpty("")
.First(),
// ...
请注意,如果您自己提供默认值,则该...OrDefault
是多余的。调用First
或Single
(仍然可以抛出多个元素)是安全的,因为它永远不会为空。
Title = (String)x.Elements()
.Where(e => e.Name.LocalName == "Title")
.Single();
或
德尔卡雷 姓名佩斯
XNamespace ns="http://www.website.co.za/namespace";
并参考它
Title = (String)x.Element(ns+"Title")
尝试:
Title = x.Elements()
.Where(e => e.Name.LocalName == "Title")
.Select(e => e.Value)
.FirstOrDefault() ?? string.Empty;
var ns = clientNode.GetDefaultNamespace();
ClientTbl ClientData = clientNode.Select(x => new ClientTbl
{
ClientCode = (string)x.Element(ns + "ClntCde") ?? string.Empty,
Title = (string)x.Element(ns + "Title") ?? string.Empty,
}
).First();
更新 1:添加了默认命名空间
更新 2:如果元素不存在,则添加空白字符串
使用此 XML 库,您可以直接引用每个元素,如果不存在,则给出默认值,如下所示:
ClientTbl ClientData = clientNode.Select(x => new ClientTbl
{
ClientCode = x.Get("ClntCde", "defaultCode"),
Title = x.Get("Title", "defaultTitle"),
Addr1 = x.Get("Address/Addr1", "addr1 default"),
// and/or
Address = x.GetElement("Address") // Creates the Address node if doesn't exist
.Select(a => new
{
Addr1 = a.Get("Addr1", "addr1 default"),
// etc
})
});
默认值为特定于类型。 如果您的代码始终为数字,则可以使用数字默认值,它将是该类型。 Get
还处理命名空间。
Get 具有以下语法(在本例中):
T Get<T>(string name, T defaultValue);