Как переопределить расширение сущности символа XmlTextReader? - PullRequest
0 голосов
/ 22 февраля 2012

Используя .Net Framework, мне нужно прочитать текст сущности XML как необработанные строковые значения (символьные сущности не раскрываются) для использования в функции сравнения / слияния.Насколько я могу судить, нет способа напрямую отключить расширение сущности персонажа.

Я пытался извлечь из XmlTextReader и перехватить метод Read (), который перехватывает чтение, но свойство Value доступно только для чтения, и я не вижу способа изменить входящий текст:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace blah {
    class XmlRawTextReader : XmlTextReader {
        public XmlRawTextReader(string fileName) : base(fileName) { }

        public override bool Read() {
            bool result = base.Read();
            if (result == true && base.HasValue && base.NodeType == XmlNodeType.Text) {
                string s = this.Value;
                //this.Value = @"new value";  // does not work - read-only
            }
            return result;
        }
    }
}

Кто-нибудь знает, как отключить расширение символьных сущностей или обновить строки в тот момент, когда они прочитаны?

Какая-то застряла здесь, так что заранее спасибо за идеи ...

1 Ответ

0 голосов
/ 01 марта 2012

После некоторого откладывания этого на задний план ответ стал очевидным:

Хотя вы не можете легко переопределить метод Read () для изменения значения чтения, вы можете подключить метод доступа к свойствучтобы сделать то же самое:

using System;
using System.Collections.Generic;
using System.Xml;

namespace blah {

    class XmlCustomTextReader : XmlTextReader {

        private Func<string, List<KeyValuePair<string, string>>, string> _updateFunc;

        public XmlCustomTextReader(string fileName, Func<string, List<KeyValuePair<string, string>>, string> updateFunc = null) : base(fileName) {
            _updateFunc = updateFunc;
        }

        //
        // intercept and override value access - 'un-mangle' strings that were rewritten by XMLTextReader
        public override string Value {
            get {
                string currentvalue = base.Value;

                // only text nodes
                if (NodeType != XmlNodeType.Text)
                    return currentvalue;

                string newValue = currentvalue;

                // if a conversion function was provided, use it to update the string
                if (_updateFunc != null)
                    newValue = _updateFunc(currentvalue, null);

                return newValue;
            }
        }
    }
}

Используйте это:

        Func<string, List<KeyValuePair<string, string>>, string> updateFunc = UpdateString;
        XmlCustomTextReader reader = new XmlCustomTextReader(fileName, updateFunc);
        reader.XmlResolver = new XmlCustomResolver(XmlCustomResolver.ResolverType.useResource);
        XDocument targetDoc = XDocument.Load(reader);

Я надеюсь, что это поможет кому-то в будущем ...

...