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」である可能性があります。これは、たとえば、データがMicrosoftWordからコピーアンドペーストされた場合に発生する可能性があります。データベースに入るとき。

SQLで文字のASCII値を調べてみてください。150または151になります。

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

その場合、XMLで&#x2013;それぞれおよび `—'としてエンコードする必要があります。

それはXMLのエンコーディングに大きく依存します。例として、IEで次のファイル(en-dashとem-dashの両方を含む)を開いてみて、それらがどのように異なる方法で処理されるかを確認してください

<?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 に答える