【问题标题】:Sitecore Loading an XML File from Media Library?Sitecore 从媒体库加载 XML 文件?
【发布时间】:2012-08-22 18:46:54
【问题描述】:

我正在尝试从媒体库加载 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 上下文中的媒体库项目。

任何关于这是否可能或我可以做些什么来使它工作的信息将不胜感激。

谢谢。

【问题讨论】:

    标签: c# xml sitecore sitecore6 xmldocument


    【解决方案1】:

    使用媒体流而不是尝试传递路径或使用 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】:

      Server.MapPath 将尝试将相对或虚拟路径映射到服务器上的物理文件/文件夹。

      尝试删除 MapPath,并为xDoc.Load(url); 努力。或者,您可以使用 WebClient 下载 XML 文档并将字符串传递给您的 XmlDocument:

      using (var client = new WebClient())
      {
          string strXml = client.DownloadString(new Uri(url));
          xmlDoc.LoadXml(strXml);
      }
      

      【讨论】:

      • 为此使用 HTTP(Web 客户端),对我来说似乎不合适。该文件可能不在磁盘上,但可以从数据库中读取和流式传输。因此,使用 Maras Musielak 的答案中的流似乎更好。
      【解决方案3】:

      这是我用来从 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 文件,而不是使用硬编码的 item 路径。
      您可以通过下面的源代码进行完整的实现。

      来源: Reading XML/JSON from Media library in Sitecore MVC

      【讨论】:

        猜你喜欢
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 2015-11-10
        • 2019-02-18
        • 2014-01-08
        相关资源
        最近更新 更多