IamIC
IamIC

Reputation: 18259

LINQ to XML only returning the first object

The XML:

<servers ver="1" namespace="RWT.Direct.Processors.Public.ROCTP">
    <procedures>
        <procedure name="Func1" returnType="">
            <params>
                <param name="p1" type="int" />
                <param name="p2" type="int" keyword="out" />
            </params>
        </procedure>
        <procedure name="Func2" returnType="int">
            <params>
                <param name="x" type="int" />
            </params>
        </procedure>
    </procedures>
</servers>

My code:

FileStream fs = new FileStream(@"D:\DIRECT\bin\base\Servers\Test.xml", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);
var doc = XDocument.Parse(sr.ReadToEnd());

List<Procedure> procedures = (from _api in doc.Element("servers").Descendants("procedures")
            select new Procedure
            {
                Name = _api.Element("procedure").Attribute("name").Value,
                ReturnType = _api.Element("procedure").Attribute("returnType").Value
            }).ToList();

  foreach (var item in procedures)
  {
      Console.WriteLine(item.Name + " " + item.ReturnType);
  }

I'm only getting "Func1" back.

Upvotes: 0

Views: 175

Answers (1)

MarcinJuraszek
MarcinJuraszek

Reputation: 125650

You're getting only one result, because you're querying for element named "Procedures", which occurred only once in your document. Check this query:

List<Procedure> procedures = (from _api in doc.Element("servers").Descendants("procedure")
                              select new Procedure
                              {
                                  Name = _api.Attribute("name").Value,
                                  ReturnType = _api.Attribute("returnType").Value
                              }).ToList();

foreach (var item in procedures)
{
    Console.WriteLine(item.Name + " " + item.ReturnType);

    foreach (var item1 in item.ParamList)
    {
        Console.WriteLine("\t" + item1.Name + " " + item1.Type + " " + item1.Keyword);
    }
}

However, you're trying to get item.ParamList which is never set by your query!

Upvotes: 2

Related Questions