Hani Honey
Hani Honey

Reputation: 2131

Retrieve a list of specific elements from an XDocument using LINQ

I have tried following tutorials about retrieving particular elements from an XDocument using LINQ, but so far every time I attempt, I am shown a message that the search yielded no results. Here is what I have at the moment (I'm trying to make a list of all the "Widgets" found in the XDoc:

        XDocument xdoc = XDocument.Parse(itemHtml);

    var widgets = from XElement x in xdoc.Descendants("Widgets")
        select x;

"itemHtml" is in String format.

Here's my XDoc

<PageData xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="PB">
  <IsMasterLayout>false</IsMasterLayout>
  <masterID>0</masterID>
  <pageID>32</pageID>
  <languageID>1033</languageID>
  <title>TestPage</title>
  <Zones>
    <DropZoneData>
      <DropZoneID>DropZone1</DropZoneID>
      <isMasterZone>false</isMasterZone>
      <Columns>
        <ColumnData>
          <Guid>00000000-0000-0000-0000-000000000000</Guid>
          <Display>true</Display>
          <columnID>0</columnID>
          <width>35</width>
          <CssClass />
          <CssFramework />
          <unit>percent</unit>
        </ColumnData>
        <ColumnData>
          <Guid>00000000-0000-0000-0000-000000000000</Guid>
          <Display>true</Display>
          <columnID>1</columnID>
          <width>65</width>
          <CssClass />
          <CssFramework />
          <unit>percent</unit>
        </ColumnData>
      </Columns>
    </DropZoneData>
  </Zones>
  <Widgets>
    <WidgetData>
      <ID xmlns="PW">23</ID>
      <ControlURL xmlns="PW">ContentBlock.ascx</ControlURL>
      <ColumnID xmlns="PW">1</ColumnID>
      <Order xmlns="PW">0</Order>
      <Minimized xmlns="PW">false</Minimized>
      <DropID>DropZone1</DropID>
      <ColumnGuid>00000000-0000-0000-0000-000000000000</ColumnGuid>
      <ChildColumns />
      <KeyValues />
      <Associations>
        <ObjectData>
          <ObjectId>33</ObjectId>
          <ObjectType>Content</ObjectType>
          <ObjectLanguage>1033</ObjectLanguage>
        </ObjectData>
      </Associations>
    </WidgetData>
    <WidgetData>
      <ID xmlns="PW">32</ID>
      <ControlURL xmlns="PW">ListSummary.ascx</ControlURL>
      <ColumnID xmlns="PW">0</ColumnID>
      <Order xmlns="PW">0</Order>
      <Minimized xmlns="PW">false</Minimized>
      <DropID>DropZone1</DropID>
      <ColumnGuid>00000000-0000-0000-0000-000000000000</ColumnGuid>
      <ChildColumns />
      <KeyValues />
      <Associations />
    </WidgetData>
  </Widgets>
</PageData> 

Upvotes: 1

Views: 64

Answers (1)

Sergey Berezovskiy
Sergey Berezovskiy

Reputation: 236318

You have default xml namespace defined xmlns="PB". Thus you need to use it when querying elements, because Widgets is only local name of element - full name will be {PB}Widgets:

XNamespace ns = "PB";

Or you can get default namespace of root:

XNamespace ns = xdoc.Root.GetDefaultNamespace();

And then use it to provide element name:

var widgets = from w in xdoc.Descendants(ns + "Widgets")
              select w;

Or simply

var widgets = xdoc.Descendants(ns + "Widgets");

Upvotes: 1

Related Questions