XslCompiledTransorm 转换将右单引号标记为编码 iso-8859-1/UTF-8 中的无效字符

发布于 2025-01-14 12:39:27 字数 1256 浏览 4 评论 0原文

我正在尝试使用 SSIS 包脚本任务和 XSLT 为来自第三方系统的每个 XML 文件生成一个文本文件。有时,这些 XML 文件中会出现一些特殊字符。其中一个字符是右单引号 '。因此,脚本任务失败,并显示消息给定编码中的字符无效。 XML 如下所示:

<firstelement>
    <Id>1112</Id>
    <State>AP</State>
    <City>E’Godavari</City>
</firstelement>

XSLT 是

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" encoding="iso-8859-1"/>
    <xsl:template match="/firstelement">
        <xsl:text>|@|Id|@|State|@|City|@|</xsl:text>
        <xsl:text>&#xd;&#xa;</xsl:text>
        |@|<xsl:value-of select="Id"/>|@|<xsl:value-of select="State"/>|@|<xsl:value-of select="City"/>|@|
    </xsl:template>
</xsl:stylesheet>

脚本任务代码如下:

    var xmlPath = @"C:\Cities.xml";
    var xsltPath = @"C:\Cities.xslt";
    var outputTxt = @"C:\Cities.txt";
    var xslCompiledTransformObj = new XslCompiledTransform();
    xslCompiledTransformObj.Load(xsltPath);
    xslCompiledTransformObj.Transform(xmlPath, outputTxt);

我尝试将 XSLT 文件的 xsl:output 标记中的编码更改为 UTF-8,但仍然遇到相同的错误。

I am trying to generate a text file for each XML file from a third party system using SSIS package script task and XSLT. Sometimes few special characters appear in these XML files. One such character is the right single quotation mark . Because of this the script task fails with message Invalid Character in the given encoding.
XML looks like below:

<firstelement>
    <Id>1112</Id>
    <State>AP</State>
    <City>E’Godavari</City>
</firstelement>

XSLT is

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" >
    <xsl:output method="text" encoding="iso-8859-1"/>
    <xsl:template match="/firstelement">
        <xsl:text>|@|Id|@|State|@|City|@|</xsl:text>
        <xsl:text>
</xsl:text>
        |@|<xsl:value-of select="Id"/>|@|<xsl:value-of select="State"/>|@|<xsl:value-of select="City"/>|@|
    </xsl:template>
</xsl:stylesheet>

The Script task code is below:

    var xmlPath = @"C:\Cities.xml";
    var xsltPath = @"C:\Cities.xslt";
    var outputTxt = @"C:\Cities.txt";
    var xslCompiledTransformObj = new XslCompiledTransform();
    xslCompiledTransformObj.Load(xsltPath);
    xslCompiledTransformObj.Transform(xmlPath, outputTxt);

I have tried changing the encoding to UTF-8 in XSLT file's xsl:output tag but i was still getting same error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

太阳男子 2025-01-21 12:39:27

请尝试以下c#。它保证考虑 XSLT 的 OutputSettings。

c#

void Main()
{
   const string SOURCEXMLFILE = @"e:\Temp\input.xml";
   const string XSLTFILE = @"e:\Temp\process.xslt";
   const string OUTPUTFILE = @"e:\temp\output.txt";
   bool paramXSLT = true;

   try
   {
      XsltArgumentList xslArg = new XsltArgumentList();

      using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
      {
         XslCompiledTransform xslt = new XslCompiledTransform();
         xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());

         XmlWriterSettings settings = xslt.OutputSettings.Clone();

         using (XmlWriter result = XmlWriter.Create(OUTPUTFILE, settings))
         {
            xslt.Transform(src, xslArg, result, new XmlUrlResolver());
            result.Close();
         }
      }
      Console.WriteLine("File '{0}' has been generated.", OUTPUTFILE);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
}

Please try the following c#. It guaranties that XSLT's OutputSettings are taken into account.

c#

void Main()
{
   const string SOURCEXMLFILE = @"e:\Temp\input.xml";
   const string XSLTFILE = @"e:\Temp\process.xslt";
   const string OUTPUTFILE = @"e:\temp\output.txt";
   bool paramXSLT = true;

   try
   {
      XsltArgumentList xslArg = new XsltArgumentList();

      using (XmlReader src = XmlReader.Create(SOURCEXMLFILE))
      {
         XslCompiledTransform xslt = new XslCompiledTransform();
         xslt.Load(XSLTFILE, new XsltSettings(true, true), new XmlUrlResolver());

         XmlWriterSettings settings = xslt.OutputSettings.Clone();

         using (XmlWriter result = XmlWriter.Create(OUTPUTFILE, settings))
         {
            xslt.Transform(src, xslArg, result, new XmlUrlResolver());
            result.Close();
         }
      }
      Console.WriteLine("File '{0}' has been generated.", OUTPUTFILE);
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
   }
}
天冷不及心凉 2025-01-21 12:39:27

下面的代码对我有用。我使用 ANSI 1252 编码,然后使用 Regex 来查找和替换特殊字符。

            var xsltPath = @"C:\Cities.xslt";
            var outputTxt = @"C:\Cities.txt";
            var xslCompiledTransformObj = new XslCompiledTransform();
            

            StreamReader streamReader = new StreamReader(xmlPath, Encoding.GetEncoding(1252));
            string content = streamReader.ReadToEnd();
            streamReader.Close();
            string xmlContent = Regex.Replace(content, "’", "'", RegexOptions.Compiled);
            XmlDocument newXml = new XmlDocument();
            newXml.LoadXml(xmlContent);
            newXml.PreserveWhitespace = true;
            newXml.Save(xmlPath);

            xslCompiledTransformObj.Load(xsltPath);
            xslCompiledTransformObj.Transform(xmlPath, outputTxt);

The below code has worked for me. I used ANSI 1252 encoding and then Regex to find and replace the special character.

            var xsltPath = @"C:\Cities.xslt";
            var outputTxt = @"C:\Cities.txt";
            var xslCompiledTransformObj = new XslCompiledTransform();
            

            StreamReader streamReader = new StreamReader(xmlPath, Encoding.GetEncoding(1252));
            string content = streamReader.ReadToEnd();
            streamReader.Close();
            string xmlContent = Regex.Replace(content, "’", "'", RegexOptions.Compiled);
            XmlDocument newXml = new XmlDocument();
            newXml.LoadXml(xmlContent);
            newXml.PreserveWhitespace = true;
            newXml.Save(xmlPath);

            xslCompiledTransformObj.Load(xsltPath);
            xslCompiledTransformObj.Transform(xmlPath, outputTxt);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文