2012-02-22 5 views
0

.Netフレームワークを使用して、XMLエンティティテキストを比較/マージ機能で使用する生の文字列値(文字エンティティは展開されていません)として読み込む必要があります。私が知る限り、文字エンティティの拡張を直接オフにする方法はありません。XmlTextReaderの文字エンティティの展開をオーバーライドする方法は?

私はXmlTextReaderクラスから派生して切片を読み込むんが、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; 
     } 
    } 
} 

文字エンティティの展開を無効にする方法や文字列を読み込む方法を知っている人はいますか?

ちょっとアイデアを事前に感謝しますので、ここで立ち往生

...

+0

エンティティは意味的には拡張文字と同じものを意味するので、比較/マージに文字を使用し、必要に応じてテキスト/ xml? – erikxiv

+0

'XmlReaderSettings'で' XmlReader.Create'を使ってみましたか? –

答えて

0

しばらくの間バックバーナーでこれを入れた後、答えが明らかになった:

あなたは簡単に読み取りをオーバーライドすることはできませんが、読み取り値を変更するには、()メソッド、あなたが同じことをやってプロパティアクセサをフックすることができます

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); 

これは将来的に誰かを助けてくれることを願っています...

関連する問題