PortalSiteMapProvider を介して別のサイト コレクションの階層を読み取ることはできません。たとえば、サイト コレクション A にいる場合、PSMP は B ではなく A のツリーのみをトラバースします。B をトラバースするには、B にいる必要があります。
私が実装した回避策は、サイト コレクションで実行され、パスをパラメーターとして受け取る単純な Web サービスを作成することでした。独自の PSMP を読み取り、階層内のそのポイントから XML ツリーを書き込みます。SC-A で実行されているコードから SC-B に存在する Web サービスを呼び出すことは、特に PSMP が B の構造を非常に迅速に破ることができるため、非常に高速です。
編集:
WSS3/MOSS で Web サービスを作成する手順は次のとおりです。
正しい方向に向かうための、まったく機能しないコードを次に示します。
//method exposed through the web service
public XmlDocument GetTree(string path)
{
PortalSiteMapProvider psmp = PortalSiteMapProvider.GlobalNavSiteMapProvider;
SiteMapNode node = psmp.FindSiteMapNode(path);
return BuildXmlFromNode(node);
}
private XmlNode BuildXmlFromNode(SiteMapNode node)
{
XmlDocument xml = new XmlDocument();
reutrn BuildXmlFromNode(node, xml);
}
//recurses down the sitemapnode children
private XmlNode BuildXmlFromNode(SiteMapNode node, XmlNode xml)
{
XmlElement element = doc.CreateElement("Node")
element.SetAttribute("title", node.Title);
element.SetAttribute("url", node.Url);
xml.AppendChild(element);
foreach(SiteMapNode childNode in node.ChildNodes)
{
BuildXmlFromNode(childNode, element);
}
return xml;
}
再帰回数に制限を設定せず、サイト マップの階層が非常に深いか広い場合、巨大な xml ドキュメントが生成される可能性があることに注意してください。注意して使用してください!