【问题标题】:C# xslt BizTalk error object reference not set to an instanceC# xslt BizTalk 错误对象引用未设置为实例
【发布时间】:2011-04-05 14:32:50
【问题描述】:

我正在使用以下代码转换 xml。 它适用于一个 xslt,但会引发异常:对象引用未设置为对象的实例。 我已经验证了两个 xslt,它们单独工作正常(意味着在转换后生成预期的 xml)。 有人可以指导我找出这里出了什么问题。我确实尝试进行一些调试,但无法获取错误详细信息或堆栈跟踪,因为它是部署在服务器上的 BizTalk 应用程序......提前致谢 这是代码。

 public static XmlDocument ApplyTransform(
       XmlDocument toTransform,
       XmlDocument StyleSheet)
   {
       XslCompiledTransform xslt = new XslCompiledTransform();
       XmlDocument transformedDoc = new XmlDocument();
       Stream stream = new MemoryStream();
       StreamWriter sw = new StreamWriter(stream);

       log4net.Ext.Serializable.SLog logger;
       logger = log4net.Ext.Serializable.SLogManager.GetLogger(@"BizTalk", typeof(RuntimeFileReader));
       logger.RegistryConfigurator();

       string logMsg = string.Format("StyleSheet used: {0}", StyleSheet);
       logger.Debug(logMsg);

       try
       {
           xslt.Load(StyleSheet);
           xslt.Transform(toTransform, null, sw);
           stream.Seek(0, SeekOrigin.Begin);
           transformedDoc.Load(stream);
       }
       catch
       {
           return null;
       }
       finally
       {
           if (sw != null)
           {
           sw.Flush();
           sw.Close();
           }
       }
       string gMsg = string.Format("xml after Transformation : {0}", transformedDoc.OuterXml);
       logger.Debug(gMsg);

       return transformedDoc;
   }

这是引发异常的 XSLT。

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="Item"/>
  <xsl:template match="node()|@*" xml:space="default">
    <xsl:copy>
      <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="errorCodes"/>
</xsl:stylesheet>

Biztalk 代码:

PIToIMTransform = new System.Xml.XmlDocument();     
PIToIMTransform.Load(
                      gh.BizTalk.Components.RuntimeFileReader
                      .GetResourceFilePath("­PInode.xslt"));
if (logger.IsDebugEnabled) {
      xmlDoc = PIToIMTransform; 
      logger.DebugFormat(logProps, "XSLT being used for transform: {0}", xmlDoc.OuterXml);
}
xmlDoc = gh.BizTalk.Components
           .XmlUtility.ApplyTransform(PItransformedDoc, PIToIMTransform); 
if (logger.IsDebugEnabled){
       logger.DebugFormat(logProps, "PI Message AFTER removed errorCodes transform: {0}"
              , xmlDoc.OuterXml);
} 

【问题讨论】:

  • 您可以访问 Biztalk 服务器上的事件日志吗?
  • 那段代码曾经在 biztalk 中成功运行过吗?
  • @Nix。我检查了事件日志,没有错误或警告。
  • 在 Biztalk Server 上会有崩溃的日志,你检查了系统和应用程序日志?
  • @Nix。是的,它使用第一个 XSLT 生成转换后的 xml,但使用相同的代码在第二个 XSLT 上抛出异常。

标签: c# exception biztalk transform xslt


【解决方案1】:

当您返回 BizTalk 时,您引用了一个空对象并崩溃(xmlDoc.OuterXml),xmlDoc 为空并且基本上执行 null.OuterXml

mlDoc = gh.BizTalk.Components
       .XmlUtility.ApplyTransform(PItransformedDoc, PIToIMTransform); 
if (logger.IsDebugEnabled){
   logger.DebugFormat(logProps, "PI Message AFTER removed errorCodes transform: {0}"
          , xmlDoc.OuterXml);
} 

建议是保护 xmlDoc 调用,并在您的异常处理块中打印出正在抛出的异常。您的关键部分出了点问题,可能是解析错误,也可能是 xsl 加载错误,试试这个:

   catch (Exception e)
   {
       logger.Error(e);
       return ;
   }

然后让我们知道正在抛出的异常。

【讨论】:

  • & @Daniel 感谢您的帮助。我已经解决了这个问题。我在第二个 XSLT 中使用了 。这就是问题所在。由于在您的帮助下我能够解决问题,因此我会将您的回复标记为答案。再次感谢您的帮助。
猜你喜欢
  • 2011-06-21
  • 1970-01-01
  • 2013-07-07
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2012-08-31
  • 2011-11-21
相关资源
最近更新 更多