我正在尝试转换某些XML [由sql查询返回,例如SELECT ... FOR XML RAW('EmailData'),ROOT('电子邮件'),输入,但无论出于何种原因,这一行都给了我一些问题:
<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&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;
}
}
答案 0 :(得分:1)
成员名称值中的连字符可能实际上是'em-dash'或'en-dash'而不是正常的hypen,如果数据是从Microsoft Word复制并粘贴的话,可能会发生这种情况。例如,进入数据库时。
尝试在SQL中查找字符的ASCII值。它可能是150或151。
SELECT ASCII(SUBSTRING(MemberName, 23, 1)) FROM Member WHERE ....
如果是这样,它们可能需要分别在XML中编码为–
和“ - ”。
这在很大程度上取决于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>
将它们编码为–
和—
会在两种情况下都有效。