C#xslt BizTalk错误对象引用未设置为实例

时间:2011-04-05 14:32:50

标签: c# exception biztalk transform xslt

我正在使用以下代码转换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);
} 

1 个答案:

答案 0 :(得分:1)

当你回到BizTalk时,你引用了一个空对象并崩溃(xmlDoc.OuterXml),xmlDoc为null,基本上是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 ;
   }

然后告诉我们正在抛出的异常。