使用LINQ从XDocument中检索特定元素的列表

时间:2014-03-11 13:48:13

标签: xml linq linq-to-xml

我尝试过关于使用LINQ从XDocument中检索特定元素的教程,但到目前为止,每次尝试时,都会显示一条消息,表明搜索没有产生任何结果。 这就是我现在所拥有的(我试图列出所有" Widgets"在XDoc中找到的内容:

        XDocument xdoc = XDocument.Parse(itemHtml);

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

" itemHtml"是String格式。

这是我的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> 

1 个答案:

答案 0 :(得分:1)

您已定义默认xml namespace xmlns="PB"。因此,在查询元素时需要使用它,因为Widgets只是元素的本地名称 - 全名将是{PB}Widgets

XNamespace ns = "PB";

或者你可以获得root的默认命名空间:

XNamespace ns = xdoc.Root.GetDefaultNamespace();

然后使用它来提供元素名称:

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

或者只是

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