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

本文关键字:设置 实例 对象引用 xslt BizTalk 错误 | 更新日期: 2023-09-27 17:48:57

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

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

当你回到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加载错误try this:

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

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