文字ストリームによるコンテンツ全体の読み取り
ReadChars、ReadBinHex、ReadBase64 の各メソッドは、大きなストリームを読み取るために使われます。それぞれの違いは、ReadChars メソッドがテキストをそのまま (US-ASCII) 読み取るのに対し、ReadBase64 メソッドは Base64 でエンコードされたテキストをデコードし、ReadBinHex メソッドは binhex でエンコードされたデータをデコードする点にあります。これは、エンコードされた国際的なテキスト、イメージ、またはビデオが XML に含まれている場合に便利です。
これらのメソッドは次のように実行します。
- ReadChars、ReadBinHex、ReadBase64 は、要素に対してだけ使用できます。他のノード タイプにこれらのメソッドを使用しても機能しません。
- バッファの実際の文字コンテンツが返されます。バッファ内のエンティティ、CDATA、またはその他のマークアップの解決は行われません。ストリームから読み取るときと同じように、開始タグと終了タグ間のすべてがマークアップを含めて返されます。
- 正規化の設定は適用されません。正規化は行われません。
- ReadChars は、操作対象の文字ストリームの末尾に達すると値 "0" を返します。リーダーの位置は、アプリケーションが ReadInnerXml を呼び出したときと同じ場所になります。
- ReadAttributeValue など、属性を読み取るすべてのメソッドは、ReadChars によるストリームからの読み取り中には動作しません。
ReadBase64 のサンプル コード
このメソッドは Base64 をデコードし、デコードされたバイナリ バイトを返します。
Dim str As String = "<ROOT>AQID</ROOT>"
Dim r As New XmlTextReader(New StringReader(str))
r.Read()
Dim buffer(1) As Byte
While r.ReadBase64(buffer, 0, 1) <> 0
Console.Write(buffer(0))
End While
Console.WriteLine()
[C#]
string str = "<ROOT>AQID</ROOT>";
XmlTextReader r = new XmlTextReader(new StringReader(str));
r.Read();
byte[] buffer = new byte[1];
while(r.ReadBase64(buffer,0,1) != 0) {
Console.Write(buffer[0]);
}
Console.WriteLine();
別のコード例については、「XmlTextReader.ReadBase64 メソッド」を参照してください。
ReadBinHex のコード サンプル
ReadBinHex サンプルへの入力として使用する "wellform.xml" を次に示します。
wellform.xml
<dt:person xmlns:dt="urn1">
<name>Alice Smith</name>
<dt:address>123 Maple Street, Seattle, WA 98112</dt:address>
<phone>(206) 555-1234</phone>
<!-- The following element is optional -->
<comments>The lady with the overgrown lawn.</comments>
<dt:date>2000-07-06</dt:date>
<time>18:31:40</time>
<dt:BinHex>000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF</dt:BinHex>
<Base64>AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8gISIjJCUmJygpKissLS4vMDEyMzQ1Njc4OTo7PD0+P0BBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWltcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/wMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbX2Nna29zd3t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/w==</Base64>
</dt:person>
このメソッドは BinHex をデコードし、デコードされたバイナリ バイトを返します。
Private Sub TestIncrementalReadBinHex()
Dim xmlReader As New XmlTextReader("wellform.xml")
Dim i As Integer
Try
Dim binhexlen As Integer = 0
Dim binhex(1000) As Byte
While xmlReader.Read()
If "dt:BinHex" = xmlReader.Name Then
Exit While
End If
End While
binhexlen = xmlReader.ReadBinHex(binhex, 0, 50)
For i = 0 To binhexlen - 1
Console.Write(binhex(i))
Next i
While "dt:BinHex" = xmlReader.Name
binhexlen = xmlReader.ReadBinHex(binhex, 0, 50)
For i = 0 To binhexlen - 1
Console.Write(binhex(i))
Next i
End While
Console.WriteLine()
xmlReader.Close()
Catch e As Exception
xmlReader.Close()
Console.WriteLine(("Exception: " & e.Message))
Return
End Try
End Sub
[C#]
private void TestIncrementalReadBinHex() {
XmlTextReader xmlReader = new XmlTextReader("wellform.xml");
try {
int binhexlen = 0;
byte[] binhex = new byte[1000];
while (xmlReader.Read()) {
if ("dt:BinHex" == xmlReader.Name) break;
}
binhexlen = xmlReader.ReadBinHex(binhex, 0, 50);
for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]);
while ("dt:BinHex" == xmlReader.Name) {
binhexlen = xmlReader.ReadBinHex(binhex, 0, 50);
for (int i=0; i < binhexlen; i++) Console.Write(binhex[i]);
}
Console.WriteLine();
xmlReader.Close();
}
catch(Exception e) {
xmlReader.Close();
Console.WriteLine("Exception: " + e.Message);
return;
}
}
別のコード例については、「ReadBinHex メソッド」を参照してください。
ReadChars のサンプル
次の XML の Item 要素ノードに位置しているとします。
<Item>test</Item>
ReadChars は "test" を返し、リーダーを </Item> EndElement の次のノードに移動させます。入力として次の XML を使用します。
...
<small>
<time>
<days> 30 </days>
<hours> 3 </hours>
<minutes> 30 </minutes>
</time>
</small>
<big>
...
この XML に対して次のコードを実行すると、現在の位置は、while ループ内では <small> タグになり、ループの終了時には <big> タグになります。
If XmlNodeType.Element = reader.NodeType And "small" = reader.Name Then
While 0 <> reader.ReadChars(buffer, 0, 1)
' Do something;
' reader is now positioned at <small>. Attribute values may not be
' available at this point.
End While
End If
' At this point the Reader is positioned at <big > tag.
[C#]
if (XmlNodeType.Element == reader.NodeType && "small" == reader.Name) {
while(0 != reader.ReadChars(buffer, 0, 1)) {
// Do something;
// reader is now positioned at <small>. Attribute values may not
// be available at this point.
}
}
// At this point the Reader is positioned at <big > tag.
ReadChars の最後まで読み取る必要がない場合は、途中で Read メソッドを呼び出すことができます。この場合、リーダーは終了要素の後ろに位置します。上記のコードでは <big> タグになります。
ReadChars を連続して呼び出すと、リーダーはテキスト内を前方へ移動します。<Item>test</Item>
というデータを与え、このメソッドを連続して呼び出した場合に生じる結果を次の表に示します。
メソッドの呼び出し | 結果 |
---|---|
1 回目の呼び出し : ReadChars(buf, 0, 2) | 2 を返し、buf には "te" が格納されます。 |
2 回目の呼び出し : ReadChars(buf, 0, 2) | 2 を返し、buf には "st" が格納されます。 |
3 回目の呼び出し : ReadChars(buf, 0, 2) | 0 を返します。 |
ReadChars メソッドは、整形式でない XML マークアップを無視します。たとえば、次に示す XML 入力は整形式ではありません。
<A>a<A>g</A>
この入力に対して ReadChars メソッドを使用すると、1 対のタグのマークアップだけが返され、その他のマークアップはすべて無視されます。つまり、この入力に対して実行された ReadChars は、次のマークアップを返します。
a<A>g</A>
参照
XmlReader による XML の読み取り | ドキュメント タイプ宣言 | XmlTextReader による空白の取り扱い | 属性値の正規化 | XmlException を使用した XmlTextReader の例外処理 | XmlReader クラス | XmlReader メンバ | XmlNodeReader クラス | XmlNodeReader メンバ | XmlTextReader クラス | XmlTextReader メンバ | XmlValidatingReader クラス | XmlValidatingReader メンバ