2

サイトのイメージ サイトマップを作成しようとしています。私がこれを行う方法は、サイトマップの各ページに対して、ページを読み込み、HTML 内のすべてのイメージ タグを解析することです。ここに簡単なスニペットがあります:

var htmlImgTags = doc.DocumentNode.SelectNodes("//img[@src]");
if (htmlImgTags != null)
    return
        htmlImgTags.Select(htmlImg => host + htmlImg.Attributes["src"].Value.Split('?').First())
                            .ToList();

したがって、各画像の URL はわかっていますが、それに関連付けられているメディア ライブラリ アイテムを取得する必要があります (画像名やその他のフィールドを取得できるようにするため)。私が得るURLの例はhttps://mysite/~/media/MySiteImages/MediaImage.ashx

画像を取得しようとしている方法は次のとおりです。

var db = Sitecore.Data.Database.GetDatabase("web");
var imageItem = db.GetItem(imageUrl);

/media/MySiteImages/MediaImage.ashxURL に、 、およびその他のバリエーションだけを渡そうとしまし/mysite/~/media/MySiteImages/MediaImage.ashxたが、すべてが null を返します

4

3 に答える 3

4

トリックを行うコードは次のとおりです。

    public Item GetMediaItem(string localPath)
    {
        int indexA = -1;
        string strB = string.Empty;
        string str1 = MainUtil.DecodeName(localPath);
        foreach (string str2 in MediaManager.Provider.Config.MediaPrefixes.Select(MainUtil.DecodeName))
        {
            indexA = str1.IndexOf(str2, StringComparison.InvariantCultureIgnoreCase);
            if (indexA >= 0)
            {
                strB = str2;
                break;
            }
        }
        if (indexA < 0 || string.Compare(str1, indexA, strB, 0, strB.Length, true, CultureInfo.InvariantCulture) != 0)
            return null;
        string id = StringUtil.Divide(StringUtil.Mid(str1, indexA + strB.Length), '.', true)[0];
        if (id.EndsWith("/", StringComparison.InvariantCulture))
            return null;
        Database database = Sitecore.Context.Database;
        if (ShortID.IsShortID(id))
            return database.GetItem(ShortID.Decode(id));
        string path = "/sitecore/media library/" + id.TrimStart('/');
        var mediaItem = database.GetItem(path);
        if (mediaItem != null)
        {
            return mediaItem;
        }
        Item root = database.GetItem("/sitecore/media library");
        if (root != null)
        {
            Item item = new ItemPathResolver().ResolveItem(StringUtil.Divide(StringUtil.Mid(localPath, indexA + strB.Length), '.', true)[0], root);
            if (item != null)
                return item;
        }
        return null;
    }
public class ItemPathResolver
{
    public virtual Item ResolveItem(string path, Item root)
    {
        return DoResolveItem(path.Split(new char[1]
        {
            '/'
        }, StringSplitOptions.RemoveEmptyEntries).ToList(), root);
    }

    protected virtual Item DoResolveItem(List<string> pathParts, Item root)
    {
        if (!pathParts.Any() || root == null)
            return root;
        string str = pathParts.First();
        List<string> range = pathParts.GetRange(1, pathParts.Count - 1);
        Item child1 = GetChild(root, str);
        Item obj = DoResolveItem(range, child1);
        if (obj == null)
        {
            string itemName = MainUtil.DecodeName(str);
            if (str != itemName)
            {
                Item child2 = GetChild(root, itemName);
                obj = DoResolveItem(range, child2);
            }
        }
        return obj;
    }

    protected virtual Item GetChild(Item item, string itemName)
    {
        foreach (Item obj in item.Children)
        {
            if (obj.Name.Equals(itemName, StringComparison.InvariantCultureIgnoreCase))
                return obj;
        }
        return null;
    }
}
于 2016-04-27T14:11:03.417 に答える
0

あなたのタスクを解決できるDynamicLinkクラスがあります:

string src = "your url";
DynamicLink dynamicLink;
if (DynamicLink.TryParse(src, out dynamicLink))
{
    var itemId = dynamicLink.ItemId;
}

dynamicLink変数には、アイテムを取得できる ItemId が含まれます。

于 2016-04-27T13:42:16.210 に答える