Работа с неверными символами XML с использованием XElement
У меня есть C# API, который возвращает объект XElement. Этот объект XElement создается с помощью кода, который выглядит следующим образом:
string invalidXML = "a \v\f\0";
XElement fe = new XElement("Data", invalidXML);
Console.WriteLine(fe);
По наблюдениям я знаю, что при попытке передать недопустимый символ XML в конструктор XElement выше, выдается исключение System.Argument.
Как оказалось, XElement не выдает ошибку, когда проходит строка с символами InvalidXML. Если вы попытаетесь напечатать XElement, скажем, через Console.WriteLine(fe), то получите исключение из XMLWriter-
System.ArgumentException: '', hexadecimal value 0x0B, is an invalid character.
at System.Xml.XmlEncodedRawTextWriter.InvalidXmlChar(Int32 ch, Char* pDst, Boolean entitize)
at System.Xml.XmlEncodedRawTextWriter.WriteElementTextBlock(Char* pSrc, Char* pSrcEnd)
at System.Xml.XmlEncodedRawTextWriter.WriteString(String text)
at System.Xml.XmlEncodedRawTextWriterIndent.WriteString(String text)
at System.Xml.XmlWellFormedWriter.WriteString(String text)
at System.Xml.Linq.ElementWriter.WriteElement(XElement e)
at System.Xml.Linq.XElement.WriteTo(XmlWriter writer)
at System.Xml.Linq.XNode.GetXmlString(SaveOptions o)
at System.Xml.Linq.XNode.ToString()
at System.IO.TextWriter.WriteLine(Object value)
at System.IO.TextWriter.SyncTextWriter.WriteLine(Object value)
at System.Console.WriteLine(Object value)
at TestLoggingForUNIT.Program.Main(String[] args) in C:\Users\shivanshu\source\repos\TestLoggingForUNIT\TestLoggingForUNIT\Program.cs:line 29
Мне кажется, что сам XElement не делает никакой проверки. Когда он печатается / сериализуется, в.NET внутренне вызывается средство записи XML, и тогда возникает исключение.
Мой вопрос заключается в том, что XElement всегда гарантирует, что будет выдано исключение, если передан недопустимый символ XML.
Другими словами, нужно ли проверять строку, которую я передаю, на наличие недопустимых символов XML? Используя что-то вроде XmlConvert.IsXmlChar(string)?
Я посмотрел на ссылку ниже, но не смог найти удовлетворительного ответа на мой вопрос-
1 ответ
Именно XmlWriter проверяет, записываются ли допустимые символы. В официальной документации соответствующая конфигурация XmlWriter описана в разделе Data Conformance:
Соответствие данных
Модуль записи XML использует два свойства из класса XmlWriterSettings для проверки соответствия данных:
Свойство CheckCharacters предписывает средству записи XML проверять символы и выдавать исключение XmlException, если какие-либо символы выходят за допустимый диапазон, определенный консорциумом W3C.
Свойство ConformanceLevel настраивает модуль записи XML для проверки того, что записываемый поток соответствует правилам для правильно сформированного документа XML 1.0 или фрагмента документа, как определено W3C. Три уровня соответствия описаны в следующей таблице. По умолчанию используется документ. Дополнительные сведения см. в описании свойства XmlWriterSettings.ConformanceLevel и перечисления System.Xml.ConformanceLevel.
Да, если для флага CheckCharacters установлено значение true, это гарантирует, что при обнаружении недопустимого символа будет выброшено исключение.
Если вы хотите разрешить запись недопустимых символов, для флага CheckCharacters можно установить значение false в XmlWriterSettings для XmlWriter, что предотвратит создание исключения. Обычно XmlWriter кодирует зарезервированные символы как объекты символов (например,
<
к
<
). Кроме того, если для флага установлено значение false, XmlWriter будет экранировать недопустимые символы в виде числовых символов (например,
\f
к

) для создания текста, соответствующего спецификации XML.