Saturday, 15 January 2011

.net - LINQ to XML filter descendants C# -



.net - LINQ to XML filter descendants C# -

i have xml sent 3rd party , want validate it.

xelement xtree = xelement.parse(@"<container> <trackingreferences> <trackingreference> <trackingname>donny</trackingname> <trackingcodes> <trackingcode> <name></name> </trackingcode> <trackingcode> <name>displaythis</name> </trackingcode> <trackingcode> <name></name> </trackingcode> </trackingcodes> </trackingreference> </trackingreferences> </container>"); ienumerable<xelement> childlist = xtree.element("trackingreferences").descendants("trackingreference").where( tr => ( tr.element("trackingname") != null && !tr.element("trackingname").isempty && !string.isnullorempty(tr.element("trackingname").value) && tr.descendants("trackingcodes").any( tc => tc.haselements && tc.elements("trackingcode").any( code => code.element("name") != null && !code.element("name").isempty && !string.isnullorempty(code.element("name").value) ) ) ) );

i can't figure out how homecoming descendants like.

the problem have want trackingreference element contain trackingcode descendants when trackingcode has name element isn't null or empty.

the below illustration returns:

<trackingreference> <trackingname>donny</trackingname> <trackingcodes> <trackingcode> <name></name> </trackingcode> <trackingcode> <name>displaythis</name> </trackingcode> <trackingcode> <name></name> </trackingcode> </trackingcodes> </trackingreference>

however in illustration don't want first , 3rd trackingcode elements returned, sec has name element value, this:

<trackingreference> <trackingname>donny</trackingname> <trackingcodes> <trackingcode> <name>displaythis</name> </trackingcode> </trackingcodes> </trackingreference>

this first time i've tried linq query xml advice on how create query more clean/efficient much appreciated, or if i'm going wrong way.

okay, sounds want trackingcode elements rather trackingreference elements, it's pretty easy:

var query = doc.descendants("trackingreference") // todo: filter based on trackingname if want... .descendants("trackingcode") .where(x => !string.isnullorempty((string) x.element("name"));

this uses fact explicit string conversion on xelement homecoming null if phone call null operand.

.net xml linq xelement descendant

No comments:

Post a Comment