1

我正在尝试转换一些 XML [由 sql 查询返回,例如 SELECT ... FOR XML RAW('EmailData'),ROOT('Emails'),type] 但无论出于何种原因,这行给我带来了问题:

<Emails>
  <EmailData ID="370" C_ID="93" Co_ID="019" MemberName="Twin Cities Orthopedics – Savage" Commit_Program_ID="92" SubmittedBy="9175" AccountExecInfo="Jessica Cooley, jcooley@cc.com" PortfolioExecInfo="Seth Bull, 000.581.5006, sbulling@CCDD.com" SupplierRepInfo="Matt Matts, 000.000.4236 Ext-37, Matt.Matts@ker.com" MemberInfoLink="https://nf.CCDD.com/asp/memberinfo.asp?memid=7893&amp;co=019" DocumentLink="https://nf.CCDD.com/asp/maintanance.asp?doc_id=630" TermsAndCondLink="https://nf.CCDD.com/TermsAndConditions.asp?CPID=92" Doc_Source_ID="BTM" SubmittedByInfo="Automated Tier Update" />
</Emails>

Cuplrit 似乎是 MemberName 属性值......因为当我返回一个空字符串而不是上述值时,我没有得到异常。您是否看到任何无效字符?'-' 是 xml 的无效字符吗?

我的 XSL 转换代码:

public static SqlXml Transform(SqlXml inputDataXML, SqlXml inputTransformXML)
        {
            try
            {
                MemoryStream memoryXml = new System.IO.MemoryStream();
                XslCompiledTransform xslt = new XslCompiledTransform();
                XmlReader output = null;

                xslt.Load(inputTransformXML.CreateReader());

                // Output the newly constructed XML
                XmlTextWriter outputWriter = new XmlTextWriter(memoryXml, System.Text.Encoding.Default);
                xslt.Transform(inputDataXML.CreateReader(), null, outputWriter, null);
                memoryXml.Seek(0, System.IO.SeekOrigin.Begin);
                output = new XmlTextReader(memoryXml);

                return new SqlXml(output);
            }
            catch(Exception ex)
            {
                byte[] byteArray = Encoding.ASCII.GetBytes( "<error>" + ex.ToString() + "</error>");
                    MemoryStream stream = new MemoryStream( byteArray );
                    XmlReader reader = new XmlTextReader(stream);
                SqlXml x = new SqlXml(reader);

                return x;
            }
        }
4

1 回答 1

2

成员名称值中的连字符可能实际上是“em-dash”或“en-dash”而不是正常的连字符,例如,如果数据是从 Microsoft Word 复制并粘贴的,则可能会发生这种情况,进入数据库时​​。

尝试找出 SQL 中字符的 ASCII 值。它将是 150 或 151。

SELECT ASCII(SUBSTRING(MemberName, 23, 1)) FROM Member WHERE ....

如果是这样,它们可能需要在 XML 中&#x2013;分别编码为和“—”。

这在很大程度上取决于 XML 的编码。例如,尝试在 IE 中打开以下文件(其中包含短划线和短划线),看看它们的处理方式有何不同

<?xml version="1.0" encoding="WINDOWS-1252"?>
<Emails> <EmailData MemberName="Twin Cities Orthopedics –— Savage"/> </Emails>

上面的文件应该可以工作,但下面的文件不应该。

<?xml version="1.0" encoding="utf-8"?>
<Emails> <EmailData MemberName="Twin Cities Orthopedics –— Savage"/> </Emails>

将它们编码为&#x2013;并且&#x2014;在这两种情况下都可以使用。

于 2012-09-01T08:38:20.347 回答