2011-07-12 4 views
0

Sharepoint Webサービスを使用してフィールド値(コンボボックス、ルックアップなど)をすばやく取得するものを作成しようとしています。次のコードは動作しますが、速度が遅く、非効率的です。これをXDocument/XElementでLINQスタイルのクエリに変換する方法はありますか?私がParseにしようとすると、OuterXmlが正しく読み込まれないようです。Sharepoint List Servicesからフィールド値を解析するLists.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の/ etcを想定しエンコーディングで問題があった疑いがある。ここではこれを残すでしょう。

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); 
      } 

答えて

関連する問題