2011-07-12 77 views
0

我在寫一些能夠快速獲取使用Sharepoint Web服務的字段值(例如組合框,查找等)的東西。下面的代碼工作,但速度慢,似乎效率低下。有什麼辦法可以用XDocument/XElement將它變成LINQ風格的查詢嗎?當我嘗試Parse OuterXml時,它似乎加載不正確。解析來自Sharepoint列表服務列表的字段值.GetList

MSDN - Lists.GetList

ProuductionResultNode = listservice.GetList(productiontable_listGUID); 
     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml(ProuductionResultNode.OuterXml); 

     XmlNamespaceManager mg = new XmlNamespaceManager(doc.NameTable); 
     mg.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/"); 
     mg.AddNamespace("z", "#RowsetSchema"); 
     mg.AddNamespace("rs", "urn:schemas-microsoft-com:rowset"); 
     mg.AddNamespace("y", "http://schemas.microsoft.com/sharepoint/soap/ois"); 
     mg.AddNamespace("w", "http://schemas.microsoft.com/WebPart/v2"); 
     mg.AddNamespace("d", "http://schemas.microsoft.com/sharepoint/soap/directory"); 
     XmlNodeList FieldsInList = doc.SelectNodes("//sp:Field", mg); 

     foreach (XmlNode Field in FieldsInList) 
     { 
      if (Field.HasChildNodes) 
      { 
       if (Field.Attributes["Name"].Value == fieldNameInternal) 
       { 
        foreach (XmlNode node in Field.ChildNodes) 
        { 
         if (node.HasChildNodes) 
         { 
          foreach (XmlNode Newnode in node.ChildNodes) 
          { 
           if (Newnode.HasChildNodes) 
           { 
            ret.Add(Newnode.InnerText); 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     return ret; 

一個例子下拉字段看起來是這樣的:

<Field Type="Choice" DisplayName="Media Type" Required="FALSE" Format="Dropdown" FillInChoice="FALSE" ID="{d814daf1-0bd2-48cc-8709-a513a3de4ef4}" SourceID="{1c01c034-f1fd-447f-8ed4-d60b997d0c3a}" StaticName="Media_x0020_Type" Name="Media_x0020_Type" ColName="nvarchar4" RowOrdinal="0" Version="3"><Default>CD/DVD</Default><CHOICES><CHOICE>CD/DVD</CHOICE><CHOICE>Hard Drive</CHOICE><CHOICE>Flash Drive</CHOICE><CHOICE>Virtual</CHOICE></CHOICES></Field> 

我使用GetListItems的其他查詢似乎beautfiully工作。

XElement ziprecords = XElement.Parse(ZipItemsResultNode.OuterXml); 
     XName name = XName.Get("data", "urn:schemas-microsoft-com:rowset"); 

     var iterationNotes = 
      from ele in ziprecords.Element(name).Elements() 
      where ele.Attribute("ows_Title").Value.Contains(fileName 
      where ele.Attribute("ows_Iteration_x0020_Notes") != null 
      select new { iterationNote = ele.Attribute("ows_Iteration_x0020_Notes").Value, 
         fileName = ele.Attribute("ows_Title").Value }; 

我的解決方案

我想出了後一些搜索的解決方案。我不知道爲什麼經常Parse和其他方法不起作用,但這似乎解決了我所做的任何錯誤。我「會離開這裏這個櫃面有人可以解釋爲什麼需要這些步驟。我懷疑有一個與編碼的問題,我認爲XDcoument /等自然會照顧。

ProuductionResultNode = listservice.GetList(productiontable_listGUID); 
      XmlDocument xdoc = new XmlDocument(); 
      XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable); 
      nsmgr.AddNamespace("ans", "http://schemas.microsoft.com/sharepoint/soap/"); 

      byte[] byteArray = Encoding.ASCII.GetBytes(ProuductionResultNode.SelectSingleNode(".//ans:Fields", nsmgr).OuterXml); 

      MemoryStream stream = new MemoryStream(byteArray); 
      XElement xe = XElement.Load(stream); 

      XElement qry = 
        (from field in xe.Descendants() 
        where field.Attribute("Name") != null 
        where field.Attribute("Name").Value == "Ship_x0020_Via" 
        select field).Single(); 

      List<string> ret = new List<string>(); 

      foreach (XElement xle in qry.XPathSelectElements(".//ans:CHOICES", nsmgr).Elements()) 
      { 
       ret.Add(xle.Value); 
      } 

回答