C#LINQ to XML查询,具有具有属性的重复元素名
沿着这条路走怎么样?(与其说是实现,不如说是想法/建议,因为我不知道您的对象模型)C#LINQ to XML查询,具有具有属性的重复元素名,c#,.net,xml,linq,linq-to-xml,C#,.net,Xml,Linq,Linq To Xml,沿着这条路走怎么样?(与其说是实现,不如说是想法/建议,因为我不知道您的对象模型) 在一个完全多态的世界中,您只有一个PartyFactory和一个if或switch语句,但是个人参与方和公司参与方是完全不同的。为了避免在访问FullName元素时出现NullReferenceException,您可以将其转换为字符串,而无需调用元素上的Value。如果不存在,则返回null,否则返回值。然后,可以在迭代结果时检查null 更改:FullName=party.Element(“FullName”
在一个完全多态的世界中,您只有一个
PartyFactory
和一个if
或switch
语句,但是个人参与方和公司参与方是完全不同的。为了避免在访问FullName
元素时出现NullReferenceException,您可以将其转换为字符串,而无需调用元素上的Value
。如果不存在,则返回null,否则返回值。然后,可以在迭代结果时检查null
更改:FullName=party.Element(“FullName”).Value,
收件人:FullName=(字符串)party.Element(“FullName”),
更新后的查询将是:
var parties = xmlDoc.Descendants("Party");
foreach(var party in parties)
{
int partyTypeCode = party.Element("PartyTypeCode").Value;
if(partyTypeCode == 1)
{
var person = personFactory.Build(party);
// do something
}
else if(partyTypeCode == 2)
{
var organization = companyFactory.Build(party);
// do something
}
}
您可以对某些项目中可能存在或不存在的所有元素执行相同的操作。我觉得艾哈迈德的解决方案是可行的。但这是我想出的方法。如果“全名”是两种不同类型的参与方节点之间唯一的区别元素,那么我猜以下可能会起作用:
var partyElements = from party in xmlDoc.Descendants("Party")
select new
{
Name = party.Attribute("id").Value,
PartyTypeCode = party.Element("PartyTypeCode").Value,
FullName = (string)party.Element("FullName"),
GovtID = party.Element("GovtID").Value,
};
您可以添加额外的区别节点(如果有),如“PartyTypeCode”。我不确定这方面的性能
var parties = xmlDoc.Descendants("Party");
foreach(var party in parties)
{
int partyTypeCode = party.Element("PartyTypeCode").Value;
if(partyTypeCode == 1)
{
var person = personFactory.Build(party);
// do something
}
else if(partyTypeCode == 2)
{
var organization = companyFactory.Build(party);
// do something
}
}
var partyElements = from party in xmlDoc.Descendants("Party")
select new
{
Name = party.Attribute("id").Value,
PartyTypeCode = party.Element("PartyTypeCode").Value,
FullName = (string)party.Element("FullName"),
GovtID = party.Element("GovtID").Value,
};
var validParty = xElement.Descendants("Party")
.Elements().Where(x => x.Name == "FullName")
.Ancestors("Party")
.Elements().Where(x => x.Name == "PartyTypeCode")
.Ancestors("Party");
var partyElements = from party in validParty
select new
{
Name = party.Attribute("id").Value,
PartyTypeCode = party.Element("PartyTypeCode").Value,
FullName = party.Element("FullName").Value,
GovtID = party.Element("GovtID").Value,
};