Есть ли способ прочитать сырое содержимое из XmlReader? - PullRequest
1 голос
/ 27 марта 2019

У меня очень большой XML-файл, поэтому я использую XmlReader в C #.Проблема в том, что часть содержимого содержит XML-подобные маркеры, которые не должны обрабатываться XmlReader.

<Narf name="DOH">Mark's test of <newline> like stuff</Narf>

Это устаревшие данные, поэтому их нельзя реорганизовать ... (конечно)

Я пробовал ReadInnerXml, но получил весь узел.Я пробовал ReadElementContentAsString, но получаю исключение, говорящее, что «новая строка» не закрыта.

// Does not deal with markup in the content (Both lines)
ms.mText = reader.ReadElementContentAsString(); 
XElement el = XNode.ReadFrom(reader) as XElement; ms.mText = el.ToString();

То, что я хочу, это ms.mText, равный «критерию Марка подобных вещей», а не исключение.

System.Xml.XmlException was unhandled
  HResult=-2146232000
  LineNumber=56
  LinePosition=63
  Message=The 'newline' start tag on line 56 position 42 does not match the end tag of 'Narf'. Line 56, position 63.
  Source=System.Xml

Повторяющийся помеченный вопрос не решилпроблема, потому что это требует изменения ввода, чтобы устранить проблему перед использованием данных.Как указано выше, это устаревшие данные.

1 Ответ

0 голосов
/ 27 марта 2019

Я понял это на основе ответов здесь! Не элегантно, но работает ...

   public class TextWedge : TextReader
   {
      private StreamReader mSr = null;
      private string mBuffer = "";

      public TextWedge(string filename)
      {
         mSr = File.OpenText(filename);
         // buffer 50
         for (int i =0; i<50; i++)
         {
            mBuffer += (char) (mSr.Read());
         }
      }
      public override int Peek() 
      {
         return mSr.Peek() + mBuffer.Length;
      }

      public override int Read()
      {
         int iRet = -1;
         if (mBuffer.Length > 0)
         {
            iRet = mBuffer[0];
            int ic = mSr.Read();
            char c = (char)ic;
            mBuffer = mBuffer.Remove(0, 1);
            if (ic != -1)
            {
               mBuffer += c;
               // Run through the battery of non-xml tags
               mBuffer = mBuffer.Replace("<newline>", "[br]");
            }
         }
         return iRet;
      }
   }
...