Различное поведение между XmlDocument.LoadXml и XDocument.Parse - PullRequest
2 голосов
/ 29 сентября 2010

Наш проект был преобразован для использования XDocument из XmlDocument несколько дней назад, но мы обнаружили странное поведение при обработке сущности XML в значении атрибута с помощью XDocument.Parse, пример кода следующий:

  1. Строка XML:

    string xml = @ "";

  2. Код XmlDocument.LoadXml и результат:

        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(xml);
        Console.WriteLine(xmlDocument.OuterXml);
    

    Результат:

  3. Код XDocument.Parse и исключение:

        XDocument xDocument = XDocument.Parse(xml);
        Console.WriteLine(xDocument.ToString());
    

    Исключение:

    Первое случайное исключение типа 'System.Xml.XmlException'произошла в System.Xml.dll '.', шестнадцатеричное значение 0x00, является недопустимым символом.Строка 1, позиция 18. в System.Xml.XmlTextReaderImpl.Throw (исключение e) в System.Xml.XmlTextReaderImpl.Throw (String res, String [] args) в System.Xml.XmlTextReaderImpl.Throw (Int32 pos,String res, String [] args) в System.Xml.XmlTextReaderImpl.ParseNumericCharRefInline (Int32 startPos, логическое раскрытие, StringBuilder internalSubsetBuilder, Int32 & charCount, EntityType & entityType & entityTypeв System.Xml.XmlTextReaderImpl.HandleEntityReference (Boolean isInAttributeValue, EntityExpandType expandType, Int32 & charRefEndPos) в System.Xml.XmlTextReaderImpl.ParseAttributeV.Exx.arx.ExTar_Text.Text.Teat_Text_DataText_DateText_DateE.XmlTextReaderImpl.ParseElement () в System.Xml.XmlTextReaderImpl.ParseDocumentContent () в System.Xml.XmlTextReaderImpl.Read () в System.Xml.Linq.XDocument.Load (XmlReader reader, LoadOpопций) в System.Xml.Linq.XDocument.Parse (текст строки, параметры LoadOptions) в System.Xml.Linq.XDocument.Parse (текст строки)

Похоже, что"& # x0;"является недопустимым символом, поэтому мы изменяем значение на допустимый символ, такой как "` ", тогда оба метода работали хорошо.

Есть ли способ изменить поведение XDocument.Parse, чтобы игнорировать недопустимый символ в атрибуте, напримерXmlDocument.LoadXml делает?

1 Ответ

2 голосов
/ 29 сентября 2010

Согласно эта сила , значение & # x0;на самом деле недействительным.Я испытал на себе, что класс XDocument следует стандарту XML, намного более строгому, чем XmlDocument (что я считаю хорошей вещью).

Прочтите статью, в которой даются советы, как обойти эту ошибку.

...