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 メンバ