sjr
sjr

Reputation: 51

Linq to XML... null and missing elements

I have an XML file

<Person>
<PersonItem id="0">
    <Time>1/8/2014</Time>
    <Step><![CDATA[Normal]]></Step>
    <HasAddress/>
    <Address/>
</PersonItem>
<PersonItem id="1">
    <Time>1/8/2014 3:21:45 PM</Time>
    <Step><![CDATA[Normal]]></Step>
    <HasAddress/>
    <Address/>
</PersonItem>
<PersonItem id="2">
    <Time>1/8/2014</Time>
    <Step><![CDATA[Normal]]></Step>
    <HasAddress>Main</HasAddress>
    <Address>
        <AddressItem id="0" location=5>
            <Address>15 Oak</Address>
        </AddressItem>
        <AddressItem id="1" location=7>
            <Address>12 Maple</Address>
        </AddressItem>
        <AddressItem id="2" location=8>
            <Address>30 Beech</Picture>
        </AddressItem>
    </Address>
</PersonItem>
</Person>

I want to put to retrieve the information and send some of it to a database. I've tried several different ways of dealing with this and I believe I'm close. Here is the Linq I tried.

public void DoIt(fileName)
{
    XElement xml = XElement.Load(fileName);

    var items = from item in xml.Elements("PersonItem")
                where (from x in item.Elements("HasAddress")
                       where  x.Element("HasAddress") != null
                       select x).Any()
                select item;

    Array.ForEach(items.ToArray(),
        o=>Console.WriteLine(o.Element("Time").Value));
    Console.ReadLine();
}

The problem is nothing is being returned.

Upvotes: 1

Views: 150

Answers (3)

Kohins
Kohins

Reputation: 337

Could be just a typo but in your xml file there is this tag error.

<Address>30 Beech</Picture>

which should be:

<Address>30 Beech</Address>

Upvotes: 1

MarcinJuraszek
MarcinJuraszek

Reputation: 125630

XDocument xml = XDocument.Load("Input.xml");

var items = from item in xml.Root.Elements("PersonItem")
            where !string.IsNullOrEmpty((string)item.Element("HasAddress"))
            select item;

For your sample XML document returns only the last PersonItem element.

Upvotes: 0

Selman Gen&#231;
Selman Gen&#231;

Reputation: 101681

Try this:

XElement xml = XElement.Load(fileName);
var items = xml.Descendants("PersonItem")
               .Where(x => (string)x.Element("HasAddress") != null)
               .Select(x => x);

Upvotes: 0

Related Questions