LINQ to XML 不同的文件
LINQ to XML with different files
我正在尝试编写一个通用实用程序来解析 XML 并返回一组客户。
问题是,其中一个文件缺少一个元素。
我想知道,是否可以使用 LINQ 处理这种情况。
在使用普通的XPATH或XMLDocument时,我们可以忽略这个或者在代码中指定一个默认值。
这是我的代码。
我的 XML 个文件
客户 1
<customers>
<customer>
<first_name>F1</first_name>
<last_name>L1</last_name>
</customer>
<customer>
<first_name>F2</first_name>
<last_name>L2</last_name>
</customer>
</customers>
客户 2
<?xml version="1.0" encoding="utf-8" ?>
<customers>
<customer>
<first_name>F1</first_name>
<middle_name>M1</middle_name>
<last_name>L1</last_name>
</customer>
<customer>
<first_name>F2</first_name>
<middle_name>M2</middle_name>
<last_name>L2</last_name>
</customer>
</customers>
我的class
public class Customer
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
}
我解析这些 XML 个文件的代码
XDocument doc = XDocument.Load(@"D:\Projects\Customer1.xml");
var cCusts = from c in doc.Descendants("customer")
select new Customer
{
FirstName = c.Element("first_name").Value,
MiddleName = c.Element("middle_name").Value,
LastName = c.Element("last_name").Value,
};
现在,当我执行代码时出现 "object reference not set" 错误,我知道这是因为;它找不到元素。
但是对于相同的查询,如果元素不存在,我们可以实际检查 "null" 还是我需要为客户 1 和 2 编写不同的代码?
你可以做类似
LastName = c.Element("last_name")?.Value;
或
LastName = c.Element("last_name")?.Value ?? "N/A";
?.
运算符将检查 c.Element("last_name")
是否为空,如果是 return 是否为空(这意味着您不会得到异常)。如果你想添加一些默认值,你可以使用第二个选项,其中 ??
检查前一个表达式是否为 null
并给 LastName
一个默认的 "N/A" 值。
此外,您在 LastName = c.Element("last_name").Value,
的末尾还有额外的 ,
。
您可以 cast XElement
到字符串而不是从 Value
属性 获取值。这样,当 middle_name
不存在时,您将获得 null
而不是空引用异常:
var cCusts = from c in doc.Descendants("customer")
select new Customer
{
FirstName = (string)c.Element("first_name"),
MiddleName = (string)c.Element("middle_name"),
LastName = (string)c.Element("last_name")
};
我正在尝试编写一个通用实用程序来解析 XML 并返回一组客户。
问题是,其中一个文件缺少一个元素。
我想知道,是否可以使用 LINQ 处理这种情况。
在使用普通的XPATH或XMLDocument时,我们可以忽略这个或者在代码中指定一个默认值。
这是我的代码。
我的 XML 个文件
客户 1
<customers>
<customer>
<first_name>F1</first_name>
<last_name>L1</last_name>
</customer>
<customer>
<first_name>F2</first_name>
<last_name>L2</last_name>
</customer>
</customers>
客户 2
<?xml version="1.0" encoding="utf-8" ?>
<customers>
<customer>
<first_name>F1</first_name>
<middle_name>M1</middle_name>
<last_name>L1</last_name>
</customer>
<customer>
<first_name>F2</first_name>
<middle_name>M2</middle_name>
<last_name>L2</last_name>
</customer>
</customers>
我的class
public class Customer
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
}
我解析这些 XML 个文件的代码
XDocument doc = XDocument.Load(@"D:\Projects\Customer1.xml");
var cCusts = from c in doc.Descendants("customer")
select new Customer
{
FirstName = c.Element("first_name").Value,
MiddleName = c.Element("middle_name").Value,
LastName = c.Element("last_name").Value,
};
现在,当我执行代码时出现 "object reference not set" 错误,我知道这是因为;它找不到元素。
但是对于相同的查询,如果元素不存在,我们可以实际检查 "null" 还是我需要为客户 1 和 2 编写不同的代码?
你可以做类似
LastName = c.Element("last_name")?.Value;
或
LastName = c.Element("last_name")?.Value ?? "N/A";
?.
运算符将检查 c.Element("last_name")
是否为空,如果是 return 是否为空(这意味着您不会得到异常)。如果你想添加一些默认值,你可以使用第二个选项,其中 ??
检查前一个表达式是否为 null
并给 LastName
一个默认的 "N/A" 值。
此外,您在 LastName = c.Element("last_name").Value,
的末尾还有额外的 ,
。
您可以 cast XElement
到字符串而不是从 Value
属性 获取值。这样,当 middle_name
不存在时,您将获得 null
而不是空引用异常:
var cCusts = from c in doc.Descendants("customer")
select new Customer
{
FirstName = (string)c.Element("first_name"),
MiddleName = (string)c.Element("middle_name"),
LastName = (string)c.Element("last_name")
};