Работа с неверными символами XML с использованием XElement - PullRequest
0 голосов
/ 04 января 2019

У меня есть 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)?

Я посмотрел ссылку ниже, но не смог найти удовлетворительный ответ на мой вопрос -

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/valid-content-of-xelement-and-xdocument-objects3

...