1

http:///_vti_bin/lists.asmx サービスの GetListItems() メソッドを使用して、SharePoint 2007 のリスト (具体的には InfoPath フォーム ライブラリ) からデータを抽出するコードを正常に作成した (そしてそれを伝えるために生きた) 人はいますか? 私の人生で見た中で最悪のXMLが返されます(XML に準拠していません)。C# でデータを解析する簡単な方法はありますか、それとも手動で解析する必要がありますか?

これに関する任意の助けをいただければ幸いです。

4

2 に答える 2

2

確かに、これは最も美しい方法ではありませんが、単に正しい例を取得するだけの問題です。

次のコードを使用して、リスト取得クエリから「もの」を取得しました。

public static XmlNodeList XpathQuery(XmlNode xmlToQuery, string xPathQuery)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xmlToQuery.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");
    return doc.SelectNodes(xPathQuery, mg);
}

を使用して呼び出す

    XmlNode items = lists.GetListItems(listName, string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, g.ToString());
    foreach (XmlNode listItem in SPCollection.XpathQuery(items, "//sp:listitems/rs:data/z:row"))
    {
        XmlAttribute id = listItem.Attributes["ows_Id"];
        if (id != null)
        {
            pageId = id.Value;                    
        }

    }

この例は多くのことを行っているわけではありませんが、うまくいけば、データを取得する方法についてのアイデアが得られます。はい、私は XPathQueries の名前空間全体の問題を非常に嫌いますが、どうしますか。

特に私たちの環境でのテストとリリースは、それ自体で数週間の労力に値するため、SharePoint Web サービスの書き直しにはあまり興味がありません。ただし、オプションがない場合もあります。たとえば、SPWeb のカスタム プロパティ バッグにアクセスしたい場合や、特定のサイト テンプレートとコンテンツ データベース (または Web サービスに実装されていない他の何百万ものもの) を使用して SiteCollection を作成したい場合です。ただし、単純なリスト アクセスの場合、Web サービスは問題ないようです。

于 2009-04-23T21:57:14.820 に答える
1

InfoPath は、リスト Web サービス内の GetListItems からの XML を処理できません。InfoPath 2007 には、次の 2 つのオプションがあります。

  1. リスト コンテンツのフィルタリングを許可しない InfoPath 2007 SharePoint データ接続を使用します。すべてのコンテンツをクライアント (InfoPath Forms Services の場合はサーバー) に戻してから、InfoPath ルール内でフィルター処理する必要があります。
  2. InfoPath 2007 が消化できる形式でデータを返す、SharePoint 内に存在する Web サービスを記述します。リスト名と CAML クエリと一連のフィールドを渡すと、名前と値のペアの行が返されます。残念ながら、現時点ではこのコードを共有することはできません。
于 2009-04-23T17:38:46.577 に答える