2010-07-12 3 views
3

에 나는 지금 내 모든 데이터와이 거대한 XML의 블로그가 셰어 GetListItems에서 XML 출력을 변환 할 수있는 쉬운 wasy가() DataTable을

com.sharepoint2.Lists lists = new Lists(); 
lists.Credentials = new System.Net.NetworkCredential("user", "pwd", "domain"); 
lists.Url = "http://sharepoint2.company.com/sites/mysite/_vti_bin/Lists.asmx"; 

XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", ""); 
XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); 
XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", ""); 
XmlNode listitems = lists.GetListItems("MyList", null, ndQuery, ndViewFields, null,ndQueryOptions, null); 
셰어

에서 데이터를 검색 할 수 있어요. 이걸 데이터 테이블로 변환하는 쉬운 방법이 있나요? 그래서이 행을 각 행을 반복하는 행렬처럼 처리합니까 ??

내가 이런 식으로 뭔가를 시도했지만 작동하지 않는 것 :

DataSet ds=new DataSet(); 
using(var reader=new XmlTextReader(listItems.OuterXml,XmlNodeType.Element,null)) 
{ 
    ds.ReadXml(reader); 
} 

웹 대 개체 모델을 Concering :

System.IO.StringReader sr = new System.IO.StringReader(listitems.OuterXml); 
XmlTextReader tr = new XmlTextReader(sr); 
DataSet ds = new DataSet("resultDataSet"); 
ds.ReadXml(tr); 
+0

개체 모델이 아닌 웹 서비스를 사용하고 있다고 추측 할 수 있습니까? –

+0

@Panagiotis Kanavos - 네, webservice를 사용하고 있습니다. (솔직히 말하면, "객체 모델을 사용하여"무슨 뜻인지 이해하지 못합니다) – leora

+0

wsp 솔루션 패키지 및 기능의 배포를 허용하려면 sharepoint 온라인을 허용하지 않습니까? –

답변

2

아, GetListItems에서 반환 된 xml은 SPListItemCollection.Xml과 almos입니다. 이 XML을 datatable로 변환하는 확장 메서드가 있습니다.

반환 된 XML에 ConvertZRowToRegularXml 메서드를 사용하면 DataTable에서 이해할 수있는 XML이 반환됩니다.

대변인 the solution은 Vincent Rothwell에게 전달됩니다.

public static class SPListItemCollectionExtensions 
    { 
     public static readonly string xsltFromZRowToXml = 
       "<xsl:stylesheet version=\"1.0\" " + 
       "xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " + 
       "xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\" " + 
       "xmlns:z=\"#RowsetSchema\">" + 
      "<s:Schema id=\"RowsetSchema\"/>" + 
      "<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" />" + 
      "<xsl:template match=\"/\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;rows&gt;</xsl:text>" + 
       "<xsl:apply-templates select=\"//z:row\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/rows&gt;</xsl:text>" + 
      "</xsl:template>" + 
      "<xsl:template match=\"z:row\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;row&gt;</xsl:text>" + 
       "<xsl:apply-templates select=\"@*\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/row&gt;</xsl:text>" + 
      "</xsl:template>" + 
      "<xsl:template match=\"@*\">" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;</xsl:text>" + 
       "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" + 
       "<xsl:value-of select=\".\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&lt;/</xsl:text>" + 
       "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" + 
       "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" + 
      "</xsl:template>" + 
      "</xsl:stylesheet>"; 

     public static DataTable GetFullDataTable(this SPListItemCollection itemCollection) 
     { 
      DataSet ds = new DataSet(); 

      string xmlData = ConvertZRowToRegularXml(itemCollection.Xml); 
      if (string.IsNullOrEmpty(xmlData)) 
       return null; 

      using (System.IO.StringReader sr = new System.IO.StringReader(xmlData)) 
      { 
       ds.ReadXml(sr, XmlReadMode.Auto); 

       if (ds.Tables.Count == 0) 
        return null; 

       return ds.Tables[0]; 
      } 
     } 

     static string ConvertZRowToRegularXml(string zRowData) 
     { 
      XslCompiledTransform transform = new XslCompiledTransform(); 
      XmlDocument tidyXsl = new XmlDocument(); 

      try 
      { 
       //Transformer 
       tidyXsl.LoadXml(Balticovo.SharePoint.Extensions. SPListItemCollectionExtensions.xsltFromZRowToXml); 
       transform.Load(tidyXsl); 

       //output (result) writers 
       using (System.IO.StringWriter sw = new System.IO.StringWriter()) 
       { 
        using (XmlTextWriter tw = new XmlTextWriter(sw)) 
        { 
         //Source (input) readers 
         using (System.IO.StringReader srZRow = new System.IO.StringReader(zRowData)) 
         { 
          using (XmlTextReader xtrZRow = new XmlTextReader(srZRow)) 
          { 
           //Transform 
           transform.Transform(xtrZRow, null, tw); 
           return sw.ToString(); 
          } 
         } 
        } 
       } 
      } 
      catch 
      { 
       return null; 
      } 
     } 
    } 
+0

이것은 훌륭하게 작동했습니다! 너와 빈센트 로스웰 모두에게 도움이된다. – leora

+0

여기에서 문제가 발견되었습니다. 열 이름에 "/"가 있으면 해당 열의 모든 데이터에 대해 공백으로 표시됩니다. 뭐가 더 나쁜지 나는 열 머리글에서 "/"를 제거했지만 여전히 웹 서비스에서 다운로드를 할 때 나타납니다. – leora

1

당신은 이런 식으로하여 XmlTextReader에 XMLNodeType과를 통과해야 서비스 : 웹 파트, 이벤트 수신기 등을 만드는 일반적인 방법은 Sharepoint의 서버 개체 모델을 사용하는 것입니다. 웹 서비스는별로 쓸데 없기 때문에 그렇게 많이 사용되지는 않습니다. Sharepoint 2010에서 새 클라이언트 개체 모델과 WCF 데이터 서비스를 사용하면 작업이 훨씬 쉬워지고 이전 ASMX 웹 서비스는 더 이상 사용되지 않는 것으로 간주됩니다.

BUT Sharepoint Online은 실제로 서버 측 코드를 허용하지 않는 2007 버전이므로 AJAX 및 ASMX 웹 서비스가 Sharepoint Online 사이트를 사용자 정의하고 통신하는 유일한 방법입니다. 이로 인해 ASMX 서비스가 더 이상 사용되지 않게되었습니다. 그림을 이동.

+0

나는 위의 코드를 사용하여 동일한 결과를 얻었습니다. – leora