Проблема с XElement и UTF-8

У меня есть веб-служба .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)
));

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


person James Alexander    schedule 18.04.2011    source источник
comment
Каков тип и значение reservationCode?   -  person Jeff Mercado    schedule 19.04.2011
comment
reservationCode — это строковый идентификатор. reservationCode на самом деле является еще одним параметром, входящим в качестве второго параметра операции веб-сервиса. Я хочу ввести его в переданный xml.   -  person James Alexander    schedule 19.04.2011


Ответы (2)


XML не поддерживает некоторые символы Unicode. См. спецификацию 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.
}
person Aristoteles    schedule 06.09.2011

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

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

            toStream.Flush();
person metaseed    schedule 10.05.2013