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,
            };