私は2つの解決策を見つけました。どちらもあまり良くありませんが、欠点が少ない方を教えてください.
どちらのソリューションも、「XmlReader」の代わりに「XmlTextReader」を直接使用することに依存しています。それには、最初のソリューションにつながるプロパティ「LinePosition」と、2 番目のソリューションの基礎としてメソッド「ReadChars」が付属しています。
解決策 (1)、インデックスを介して元の文字列からデータを取得する
問題:
- ストリーム入力では機能しません
- xml に複数の行がある場合は機能しません
コード
string TXML = @"<xml><data></data><rawnode at=""10 4""><text>hallöle</text><z d=""2"">3</z></rawnode><data></data></xml>";
//XmlReader r = XmlReader.Create(new StringReader(TXML));
XmlTextReader r = new XmlTextReader(new StringReader(TXML));
// read to node which shall be retrived "raw"
while ( r.Read() )
{
if ( r.Name.Equals("rawnode") )
break;
}
// here we start
int Begin = r.LinePosition;
r.Skip();
int End = r.LinePosition;
// get it out
string output=TXML.Substring(Begin - 2, End - Begin);
解決策 (2)、「ReadChars」でデータを取得する
問題:
- 読み取りたいタグの「外側」マークアップを解析して再作成する必要があります。
- これにより、パフォーマンスが低下する可能性があります。
- エラーが発生する可能性があります。
コード:
// ... again create XmlTextReader and read to rawnode, then:
// here we start
int buflen = 15;
char[] buf = new char[buflen];
StringBuilder sb= new StringBuilder("<",20);
//get start tag and attributes
string tagname=r.Name;
sb.Append(tagname);
bool hasAttributes = r.MoveToFirstAttribute();
while (hasAttributes)
{
sb.Append(" " + r.Name + @"=""" + r.Value + @"""");
hasAttributes = r.MoveToNextAttribute();
}
sb.Append(@">");
r.MoveToContent();
//get raw inner data
int cnt;
while ((cnt = r.ReadChars(buf, 0, buflen)) > 0)
{
if ( cnt<buflen )
buf[cnt]=(char)0;
sb.Append(buf);
}
//append end tag
sb.Append("</" + tagname + ">");
// get it out
string output = sb.ToString();