gpt4 book ai didi

c# - 使用 XML to Linq 获取 XML 元素值

转载 作者:行者123 更新时间:2023-11-30 22:02:38 25 4
gpt4 key购买 nike

XML im 查询的片段是

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata created="2014-11-03T18:13:02.769Z" xmlns="http://example.com/ns/mmd-2.0#" xmlns:ext="http://example.com/ns/ext#-2.0">
<customer-list count="112" offset="0">
<customer id="5f6ab597-f57a-40da-be9e-adad48708203" type="Person" ext:score="100">
<name>Bobby Smith</name>
<gender>male</gender>
<country>US</country>
<birth-span>
<start>1965-02-18</start>
<end>false</end>
</birth-span>

我写的获取元素的代码是

    GetCustomer = from c in XDoc.Descendants(ns + "customer")
select
new Customer
{
Name = c.Element(ns + "name").ToString(),
Gender = Convert.ToString(c.Element(ns + "gender")),
BeginDate = c.Elements("birth-span").Any() ? c.Element("start").Value.ToString() : "No data found"

我遇到的问题是 birth-span,如果 birth-span 存在,我似乎从来没有得到值(有些记录不包含 birth-span 元素)。对于确实包含 birth-span 元素的记录,我添加了不起作用的命名空间变量(抛出对象未设置为实例的错误)

 BeginDate = c.Elements(ns + "birth-span").Any() ? c.Element(ns + "start").Value.ToString() : "No data found"

我添加了不同的变体,但要么我得到值 No Data found 要么错误(似乎是对象未设置为实例)。谁能看出我做错了什么?

最佳答案

通过这样做,您将 start 视为 c(或 customer)的直接后代:

BeginDate = c.Elements("birth-span").Any() ?
c.Element("start").Value.ToString() :
"No data found"

当你真正想要将 start 视为 birth-span 元素的直接后代时,如下所示:

BeginDate = c.Elements("birth-span").Any() ?
c.Element("birth-span").Element("start").Value.ToString() :
"No data found"

不过还有改进的余地。 birth-span 元素是零个还是一个,还是零个或多个?由于它看起来像是零或一,您可以这样做并使其更清晰:

var customers = from c in doc.Descendants("customer")
let birthSpan = c.Element("birth-span")
select new
{
Name = c.Element("name").Value,
Gender = c.Element("gender").Value,
BeginDate = birthSpan == null ?
"No data found" :
birthSpan.Element("start").Value
};

此外,无需对其中任何一个调用 Convert.ToString.ToString()。如果你想要一个 string.Value() 就可以了。如果你真的想把它打成别的东西,直接转换它并让转换运算符完成工作:

var customers = from c in doc.Root.Descendants("customer")
let birthSpan = c.Element("birth-span")
select new
{
Name = (string)c.Element("name"),
Gender = (string)c.Element("gender"),
BeginDate = birthSpan == null ?
(DateTime?)null :
(DateTime?)birthSpan.Element("start")
};

关于这方面有一篇很棒的文章 here .

关于c# - 使用 XML to Linq 获取 XML 元素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26722782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com