XmlReader によるコンテンツのスキップ
コンテンツをスキップするには、2 つの方法があります。1 つは、MoveToContent メソッドを使用して、コンテンツに直接移動するメソッドを呼び出す方法です。もう 1 つは、現在のノードから子ノードをスキップする Skip メソッドを直接呼び出す方法です。
コンテンツへの直接移動
コンテンツに移動するには、MoveToContent メソッドを使用します。このメソッドは、現在のノードをチェックして、ノードがコンテンツ ノードかどうかを確認します。コンテンツ ノードとは、Text、CDATA、Element、EndElement、EntityReference、または EndEntity ノードのいずれかです。ノードが前述のノード タイプの 1 つに該当しない場合は、そのノードをスキップして次のノードまたはファイルの末尾に移動します。該当するタイプのノードが見つかるかファイルの末尾に達すると、スキップを停止します。言い換えると、次のノード タイプはスキップされます。
- XmlDeclaration
- ProcessingInstruction
- DocumentType
- Comment
- Attribute
- Whitespace
- SignificantWhitespace
アプリケーションがコンテンツだけを必要としている場合は、Read を呼び出すよりも、この方法でコンテンツを移動する方が効率的です。Read では、リーダーを次のノードに移動させ、アプリケーションによってノード タイプをテストし、読み取るコンテンツがあるかどうかを判定し、ある場合は読み取るという手順が必要になります。
アプリケーションが属性ノードに位置している場合に MoveToContent を呼び出すと、現在のノードの位置は、その属性を所有している要素に移動します。アプリケーションが既にコンテンツ ノードに位置している場合は、MoveToContent 呼び出しから NodeType プロパティの値がアプリケーションに返されます。これらの動作によって、アプリケーションはランダムな XML マークアップをスキップできます。たとえば、次のような XML 入力があるとします。
<?xml version="1.0">
<!DOCTYPE price SYSTEM "abc">
<!the price of the book ->
<price>123.4</price>
"123.4" という price
要素を検索し、そのテキスト コンテンツを倍精度浮動小数点数型に変換するコードを次に示します。
If readr.MoveToContent() = XmlNodeType.Element And readr.Name = "price" Then
_price = XmlConvert.ToDouble(readr.ReadString())
End If
[C#]
if (readr.MoveToContent() == XmlNodeType.Element && readr.Name =="price")
{
_price = XmlConvert.ToDouble(readr.ReadString());
}
別の例として、MoveToContent は、XML ファイルの DocumentElement ノードを検索するために使われることがよくあります。入力として file.xml という次の XML ファイルがあるとします。
<?xml encoding="utf-8"?>
<!-- Can have comment and DOCTYPE nodes here to skip past here -->
<phone a="2" b="N">
<data>
<d1>Data</d1>
<d2>More Data</d2>
<d3>Some More Data</d3>
</data>
</phone>
次のコードでは、リーダーの位置を DocumentElement ノードの <phone>
に移動します。
Dim doc as XmlDocument = New XmlDocument()
Dim treader as New XmlTextReader("file.xml")
treader.MoveToContent()
[C#]
XmlDocument doc = new XmlDocument();
XmlTextReader treader = new XmlTextReader("file.xml");
treader.MoveToContent();
Skip メソッドによるデータのスキップ
Skip メソッドは現在の要素をスキップします。ノード タイプが XmlNodeType.Element の場合に Skip を呼び出すと、要素のすべてのコンテンツと要素終了タグがスキップされます。
たとえば、次のような XML があるとします。
<a name="facts" location="123">
<x/>
abc
<y/>
</a>
<b>
...
</b>
<a>
ノードまたはその属性のいずれかに位置している場合に Skip を呼び出すと、<b>
ノードに移動します。x
のような葉ノードまたはテキスト ノード abc
に位置している場合は、Skip を呼び出すと次のノードにスキップし、実際には Read を呼び出した場合と同じ動作になります。
Skip では、コンテンツに整形式の規則が適用されます。
参照
XmlReader による XML の読み取り | XmlReader における現在のノードの位置 | XmlReader のプロパティ設定 | XmlReader と XmlNameTable によるオブジェクトの比較 | XmlReader による属性の読み取り | 要素および属性のコンテンツの読み取り | EntityReference の読み取りと展開 | XmlReader と SAX リーダーの比較 | XmlTextReader による XML データの読み取り | XmlNodeReader によるノード ツリーの読み取り | XmlValidatingReader による XML の検証 | カスタマイズされた XML リーダーの作成 | XmlReader クラス | XmlReader メンバ | XmlNodeReader クラス | XmlNodeReader メンバ | XmlTextReader クラス | XmlTextReader メンバ | XmlValidatingReader クラス | XmlValidatingReader メンバ