我正在尝试从媒体库加载xml文件,但我遇到路径问题。我可以在xml文件位于实际服务器文件中时加载xml,或者当它位于另一个托管站点时加载xml,但是当文件位于媒体库中时则不能加载xml。 xml文件是否必须是托管在某处的物理文件?
以下是我检索媒体项目路径的代码:
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item sampleItem = master.GetItem("/sitecore/media library/Files/eBooks/testxml");
Sitecore.Data.Items.Item sampleMedia = new Sitecore.Data.Items.MediaItem(sampleItem);
string url = Sitecore.StringUtil.EnsurePrefix('/', Sitecore.Resources.Media.MediaManager.GetMediaUrl(sampleMedia));
然后当我加载xml时,我正在执行以下操作:
XmlDocument xDoc = new XmlDocument();
xDoc.Load(Server.MapPath(url));
它返回的路径是正确的,因为我已经测试过它将它放在一个锚标签中,看它是否会链接到xml文件,它确实如此。我在这个网站上发现了类似的帖子,但似乎都没有在xml.Load的上下文中处理媒体库项目。
关于这是否可行或我能做些什么来使其发挥作用的任何信息都将非常感激。
谢谢。
答案 0 :(得分:6)
Server.MapPath
会尝试将相对或虚拟路径映射到服务器上的物理文件/文件夹。
尝试删除MapPath,然后转到xDoc.Load(url);
。或者,您可以使用WebClient下载XML文档并将字符串传递给XmlDocument:
using (var client = new WebClient())
{
string strXml = client.DownloadString(new Uri(url));
xmlDoc.LoadXml(strXml);
}
答案 1 :(得分:6)
使用媒体流而不是尝试传递路径或使用WebClient:
Sitecore.Data.Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Sitecore.Data.Items.Item sampleItem = master.GetItem("/sitecore/media library/Files/testxml");
Sitecore.Data.Items.Item sampleMedia = new Sitecore.Data.Items.MediaItem(sampleItem);
XmlDocument xmdDoc = new XmlDocument();
xmdDoc.Load(MediaManager.GetMedia(sampleMedia).GetStream().Stream);
答案 2 :(得分:1)
以下是我用于从Sitecore媒体库中读取XML(或可能是JSON)文件的示例代码。
Sitecore.Data.Items.Item xmlMedia = new Sitecore.Data.Items.MediaItem(Sitecore.Context.Database.GetItem("/~/media/mySiteName/files/sampleXmlItem"));
//OR
Sitecore.Data.Items.Item xmlMedia = new Sitecore.Data.Items.MediaItem(Sitecore.Context.Database.GetItem(RenderingContext.Current.Rendering.DataSource));
var fileType = xmlMedia.Fields["Extension"].Value;
if (fileType == "xml" || fileType == "XML")
{
XmlDocument xmdDoc = new XmlDocument();
xmdDoc.Load(Sitecore.Resources.Media.MediaManager.GetMedia(xmlMedia).GetStream().Stream);
XmlDocument innerXmdDoc = new XmlDocument();
innerXmdDoc.LoadXml(xmdDoc.LastChild.OuterXml);
myData = JsonConvert.SerializeXmlNode(innerXmdDoc);
}
您可以使用xml文件作为数据源,而不是使用硬编码的项目路径,并通过读取当前的渲染项来读取xml文件。
您可以通过以下来源完成实施。