Выпуск XElement & UTF-8 - PullRequest
       11

Выпуск XElement & UTF-8

2 голосов
/ 19 апреля 2011

У меня есть веб-служба .NET (.asmx, а не .svc), которая принимает строку через HTTP POST. Строки, которые он принимает, представляют собой xml-инфо-наборы, которые я затем анализирую с помощью XElement.Parse. После анализа в экземпляре XElement я добавляю узел к одному из элементов в экземпляре.

Проблема, с которой я сталкиваюсь, заключается в том, что если по какой-то причине возникает строка, представляющая инфо-набор xml, то добавление узла к элементу XElement вызывает исключение, такое как "'", шестнадцатеричное значение 0x06, является недопустимым символ. Строка 1, позиция 40. ". Я получаю широкий спектр ошибок 0x (*). Если я не попытаюсь добавить узлы в XElement, все будет хорошо. Вот как я добавляю элемент:

var prospect = doc.Element("prospect");
var provider = prospect.Element("provider");

provider.Add(new XElement("id",
    new XAttribute("reservation-code",
    reservationCode)
));

Есть ли какое-то преобразование строк, которое я должен где-то делать?

Ответы [ 2 ]

4 голосов
/ 06 сентября 2011

XML не позволяет использовать некоторые символы Юникода. См. Спецификация XML 1.0 . К сожалению, стандартного способа избежать этих символов в XML тоже нет. Например, вы не можете избежать его в действительном XML, используя 	 из-за ограничения правильной формы: Юридический символ (см. ссылки на символы ).

В XElement.ToString() включена проверка этих символов. Однако .NET предоставляет способ отключить проверку символов. По умолчанию он отключен в экземплярах System.Xml.XmlWriter. Поэтому будет работать следующий код:

    /// <summary>
    /// Returns the XML string of the <paramref name="xElement"/> WITHOUT CHARACTER CHECKING.
    /// </summary>
    /// <param name="xElement"></param>
    /// <returns></returns>
    public static string ToStringWithoutCharacterChecking(this XElement xElement)
    {
        using (System.IO.StringWriter stringWriter = new System.IO.StringWriter())
        {
            using (System.Xml.XmlTextWriter xmlTextWriter = new XmlTextWriter(stringWriter))
            {
                xElement.WriteTo(xmlTextWriter);
            }
            return stringWriter.ToString();
        }
    }

Обратите внимание, однако, что если вы создаете экземпляр System.Xml.XmlWriter, используя System.Xml.XmlWriterSettings, по умолчанию true для проверки символов. Поэтому, если вы используете System.Xml.XmlWriterSettings и хотите отключить проверку символов, используйте:

XmlWriterSettings s = new XmlWriterSettings();
s.CheckCharacters = false;
using(XmlWriter w = XmlWriter.Create(..., s))
{
    //etc.
}
0 голосов
/ 10 мая 2013

спасибо большое, что решило мою проблему при использовании linq to xsd. вот мой код: // не используем container.Save(new StreamWriter(toStream, new UTF8Encoding(false))); вместо этого используйте коды:

using (XmlWriter w = XmlWriter.Create(new StreamWriter(toStream, new UTF8Encoding(false)), new XmlWriterSettings
            {///4508792/vypusk-xelement-utf-8
                //http://stackoverflow.com/questions/10057171/xdocument-prevent-invalid-charachters
                Indent = true,
                CheckCharacters = false
            }))
            {
                XTypedServices.Save(w, container.Untyped);
            }

            toStream.Flush();
...