通过 Linq 获取 XML 值时设置默认值

发布于 2024-09-15 02:20:28 字数 850 浏览 3 评论 0原文

我正在使用 Linq 从某些 XML 中提取值。下面显示的是一个简化的示例,显示了我遇到的问题。以下代码在如下所示的 XML 上运行良好。我遇到的问题是 groupBy 部分丢失。因为当缺少 Data.Element("groupBy").Element("property) 时,会失败,因为 Data.Element("groupBy") 将为 null。是否可以修改我的 Linq 语句以允许它提供默认值还是应该以不同的方式处理它?

var e = (from Data in theXML.Descendants("exportFile")
 select new Export
 {    
     OutputFileName = Data.Element("outputFileName") != null ? (string)Data.Element("outputFileName") : "",
     GroupByProperty =  Data.Element("groupBy").Element("property") != null ? (string)Data.Element("groupBy").Element("property") : ""
 }).First();

<exportFile>
    <outputFileName>output.xml</outputFileName>
    <groupBy>
        <property>DeviceId</property>
    </groupBy>
</exportFile>

I’m using Linq to extract values from some XML. Shown below is a simplified example to show the problem I’m having. The following code works fine on the XML shown below. The problem I have is when the groupBy section is missing. Because when it’s missing Data.Element("groupBy").Element("property) fails because Data.Element("groupBy") will be null. Is it possible to modify my Linq statement to allow it to provide a default or should it be approached in a different way?

var e = (from Data in theXML.Descendants("exportFile")
 select new Export
 {    
     OutputFileName = Data.Element("outputFileName") != null ? (string)Data.Element("outputFileName") : "",
     GroupByProperty =  Data.Element("groupBy").Element("property") != null ? (string)Data.Element("groupBy").Element("property") : ""
 }).First();

<exportFile>
    <outputFileName>output.xml</outputFileName>
    <groupBy>
        <property>DeviceId</property>
    </groupBy>
</exportFile>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

溺深海 2024-09-22 02:20:29

您已经可以使其比使用空合并运算符稍微好一些。但是,处理缺少的 groupby 元素会更困难:

select new Export
{    
    OutputFileName = (string) Data.Element("outputFileName") ?? "",
    GroupByProperty = Data.Element("groupBy") == null ? ""
           : (string) Data.Element("groupBy").Element("property") ?? ""
}).First();

如果元素引用为 null,则转换为字符串只会返回 null。

另一种选择是:

GroupByProperty = 
    (string) Data.Elements("groupBy").Elements("property").FirstOrDefault() ?? ""

使用扩展方法,该方法允许您在 IEnumerable 上调用 Elements ...,以便(懒惰地)评估每个的序列Data 下的 groupBy 元素下的 property 元素,然后获取其中的第一个(如果存在),然后应用字符串转换。

You can already make it slightly nicer than it is using the null coalescing operator. However, to cope with the groupby element being missing is harder:

select new Export
{    
    OutputFileName = (string) Data.Element("outputFileName") ?? "",
    GroupByProperty = Data.Element("groupBy") == null ? ""
           : (string) Data.Element("groupBy").Element("property") ?? ""
}).First();

The conversion to string just returns null if the element reference is null.

An alternative would be:

GroupByProperty = 
    (string) Data.Elements("groupBy").Elements("property").FirstOrDefault() ?? ""

That uses the extension method which allows you to call Elements on an IEnumerable<XElement>... so that will (lazily) evaluate a sequence of every property element under a groupBy element under Data, then take the first of them if any exist, then apply the string conversion.

烏雲後面有陽光 2024-09-22 02:20:29

您可以简单地在语句中添加额外的检查(并使用空合并运算符清理一些内容):

GroupByProperty = Data.Element("groupBy") != null ? 
    (Data.Element("groupBy").Element("property") ?? "") : "";

You could simply add an additional check in the statement (and clean things up a bit using the null coalescing operator):

GroupByProperty = Data.Element("groupBy") != null ? 
    (Data.Element("groupBy").Element("property") ?? "") : "";
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文