System.Xml.XmlException: Произошла ошибка при разборе EntityName

Я пытаюсь преобразовать некоторый 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, [email protected]" PortfolioExecInfo="Seth Bull, 000.581.5006, [email protected]" SupplierRepInfo="Matt Matts, 000.000.4236 Ext-37, [email protected]" 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;
            }
        }

person Robert    schedule 01.09.2012    source источник
comment
Роберт, Предоставленный XML имеет правильный формат и нормально загружается совместимым синтаксическим анализатором XML. Ошибка может быть в другой записи.   -  person Dimitre Novatchev    schedule 01.09.2012
comment
Спасибо Димитре. Как вы думаете, может ли возникнуть ошибка во время преобразования и, возможно, проблема с XSLT? Я проверил xslt, и я не вижу ничего странного.   -  person Robert    schedule 01.09.2012


Ответы (1)


Возможно, что дефис в значении имени члена на самом деле является «длинным тире» или «длинным тире» вместо обычного дефиса, что может произойти, если данные были скопированы и вставлены из Microsoft Word, например, при входе в базу.

Попробуйте узнать ASCII-значение символа в SQL. Это будет либо 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; будет работать в обоих случаях.

person Tim C    schedule 01.09.2012
comment
Вы абсолютно правы! Спасибо!!! Есть ли где-нибудь список символов, которые нужно закодировать? Я уже вызываю System.Security.SecurityElement.Escape, но, по-видимому, Char 150 не кодируется этим классом. - person Robert; 01.09.2012