草庐IT

xml - 优雅地处理 Umbraco XSLT 宏中丢失的 XML 提要

coder 2024-06-28 原文

我正在尝试使用 Umbraco 中的 XSLT 宏读取 XML 提要,并让它以良好的格式显示内容。当提要可用时,我的宏工作正常,但如果提要返回 404,我无法设法让 XSLT 妥善处理它。

我正在使用 umbraco.library:GetXmlDocumentByUrl() 获取 XML 我发现它正在创建一个解析错误,有时它只是使站点崩溃而不是返回我指定的错误文本。

我还尝试将 GetXmlDocumentByUrl() 包装在 document() 测试中,看看我是否可以使用它来更好地处理错误。我发现虽然这会阻止网站崩溃,并且在 XML 提要存在的情况下也能正常工作,但它仍然会产生解析错误而不是显示我的错误文本。

如果有任何帮助或建议,我将不胜感激,我的代码如下:

<xsl:variable name="feed" select="'http://url.to.feed'"/>

<xsl:template match="/">
  <xsl:value-of select="document($feed)"/>
  <!-- start writing XSLT -->
  <xsl:choose>
    <xsl:when test="string-length($feed) > 0 and $feed != ''">
      <xsl:choose>
        <xsl:when test="document($feed)">
           File found
          <xsl:variable name="feedContent" select="umbraco.library:GetXmlDocumentByUrl($feed, $cacheRate)"/>
          <xsl:choose>
            <xsl:when test="count($feedContent/error) &gt; 0">
            <!--<xsl:when test="$feedContent != 'error'">-->
              <p class="feedList">
                <strong>This dynamic content is currently not available</strong><br />
                The content could not be loaded. Please verify that you are on the correct page and that you have an
                active internet connection.
              </p>
            </xsl:when>
            <xsl:otherwise>
              <xsl:call-template name="renderFeed">
                <xsl:with-param name="feedContent" select="$feedContent"/>
              </xsl:call-template>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:when>
        <xsl:otherwise>
            Can't find the file...
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <p class="feedList">
        <strong>No content exists for this page</strong><br />
        Please view another page.
      </p>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

更新: 我已经尝试浏览我的代码以将问题简化为以下内容,这应该使用 GetXmlDocumentByUrl 的非缓存实现,这样我就可以确保我在那里没有问题并直接将值输出到确保这不是我选择的语句:

 <xsl:template match="/">
  <!-- start writing XSLT -->
  <xsl:choose>
    <xsl:when test="string-length($feed) > 0 and $feed != ''">
      <xsl:variable name="vDoc" select="umbraco.library:GetXmlDocumentByUrl($feed)"/>
      <xsl:value-of select="$vDoc"/>
      <xsl:choose>
        <xsl:when test="$vDoc">
           File found
        </xsl:when>
        <xsl:otherwise>
            Can't find the file...
        </xsl:otherwise>
      </xsl:choose>
    </xsl:when>
    <xsl:otherwise>
      <p class="feedList">
        <strong>No content exists for this page</strong><br />
        Please view another page.
      </p>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

对于明确的 404 页面,它返回一个字符串“System.Net.WebException:远程服务器返回错误:(404)未找到。在 System.Net.HttpWebRequest.GetResponse() 在 umbraco.library.GetXmlDocumentByUrl( String Url)"但是,对于我实际上遇到超时问题的提要,我仔细检查了 fiddler,似乎该页面实际上返回了 200,但不是 XML 文档,我应该在我的 renderFeed 中提到这一点模板如下,所以我仍然希望它显示其他内容而不是超时。

 <xsl:template name="renderFeed">
  <xsl:param name="feedContent" />
  <xsl:choose>
    <xsl:when test="count($feedContent//item) &gt; 0">
        //Render Feed content
    </xsl:when>
    <xsl:otherwise>
     <p class="feedList">
        <strong>No content exists for this page</strong><br />
        Please view another page.
      </p>
   </xsl:otherwise>
  </xsl:choose>
</xsl:template>

我从示例中获得了 when 测试,是否有更好的方法来测试它?

最佳答案

我能看到的唯一问题是,如果您的 XmlDocument 正在加载 text/html 而不是 text/xml 的 ContentType 。我写了一个简单的函数,基于 Umbraco 中的原始函数,允许您更改 WebRequest 超时,它会检查 ContentType

public static XPathNodeIterator GetXmlDocumentByUrl(string Url, int requestTimeout = 100000)
{
    XmlDocument xmlDoc = new XmlDocument();
    WebRequest request = WebRequest.Create(Url);

    try
    {
        // Set the Request Timeout
        request.Timeout = requestTimeout;
        using (WebResponse response = request.GetResponse())
        {
            if (response.ContentType.Contains("text/xml"))
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    XmlTextReader reader = new XmlTextReader(responseStream);
                    xmlDoc.Load(reader);
                }
            }
            else
                xmlDoc.LoadXml(string.Format("<error url=\"{0}\">Failed to load an ContentType of XML</error>",
                                             HttpContext.Current.Server.HtmlEncode(Url)));
        }
    }
    catch (WebException err)
    {
        xmlDoc.LoadXml(string.Format("<error url=\"{0}\">{1}</error>",
                                     HttpContext.Current.Server.HtmlEncode(Url), err));
    }
    catch (Exception err)
    {
        xmlDoc.LoadXml(string.Format("<error url=\"{0}\">{1}</error>",
                                     HttpContext.Current.Server.HtmlEncode(Url), err));
    }

    XPathNavigator xp = xmlDoc.CreateNavigator();
    return xp.Select("/");
}

关于xml - 优雅地处理 Umbraco XSLT 宏中丢失的 XML 提要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9068376/

有关xml - 优雅地处理 Umbraco XSLT 宏中丢失的 XML 提要的更多相关文章

  1. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  2. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby-on-rails - Rails 优雅地处理超时 session ? - 2

    使用rails4,ruby2。我在rails配置中为我的cookiesession设置了30分钟的超时时间。问题是,如果我转到表单,让session超时,然后提交表单,我会收到此ActionController::InvalidAuthenticityToken错误。如何在Rails中优雅地处理这个错误?比如说,重定向到登录屏幕? 最佳答案 在您的ApplicationController:rescue_fromActionController::InvalidAuthenticityTokendoredirect_tosome_p

  5. ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数) - 2

    我有一个名为Post的类,我需要能够适应以下场景:如果用户选择了一个类别,则只显示该类别的帖子如果用户选择了一种类型,则只显示该类型的帖子如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子如果用户没有选择任何内容,则显示所有帖子我想知道我的Controller是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法-有谁知道我如何才能做到这一点?classPostsController 最佳答案 您最好遵循“胖模型,瘦Controller”的惯例,这意味着您应该将这种逻辑放在模型本身中。Post类应该能够报告

  6. ruby - 获取数组中的值并最小化某个类属性的最优雅的方法是什么? - 2

    假设我有以下类(class):classPersondefinitialize(name,age)@name=name@age=ageenddefget_agereturn@ageendend我有一组Person对象。是否有一种简洁的、类似于Ruby的方法来获取最小(或最大)年龄的人?如何根据它对它们进行排序? 最佳答案 这样做会:people_array.min_by(&:get_age)people_array.max_by(&:get_age)people_array.sort_by(&:get_age)

  7. ruby-on-rails - 优雅的 Rails : multiple routes, 相同的 Controller Action - 2

    让多条路线去同一条路的最优雅的方式是什么ControllerAction?我有:get'dashboard',to:'dashboard#index'get'dashboard/pending',to:'dashboard#index'get'dashboard/live',to:'dashboard#index'get'dashboard/sold',to:'dashboard#index'这很丑陋。有什么“更优雅”的建议吗?一个类轮的奖励积分。 最佳答案 为什么不只有一个路由和一个Controller操作,并根据传递给它的参数来

  8. ruby - 鸭子输入字符串、符号和数组的优雅方式? - 2

    这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby​​。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac

  9. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  10. ruby - 如何更优雅地记下这三种情况? - 2

    是否可以让这段代码更紧凑?我在这里错过了什么吗?ifvaluemax_ratemax_rateelsevalueend 最佳答案 这里有一些完全不同的东西:[min_rate,value,max_rate].sort[1] 关于ruby-如何更优雅地记下这三种情况?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13309740/

随机推荐