none
XmlTextReaderについて RRS feed

  • 質問

  • XmlTextReaderについて

    VS2005環境でVC#のXmlTextReaderを使いXML文書を読み込んでいます。

    while( READER.Read() )
    {
     switch( READER.NodeType )
     {
      case XmlNodeType.Element:
       break;
      case XmlNodeType.EndElement:
       break;
     }
     ....
    }

    ここで質問なのですが
    以下のように

    <NODE name="NA" expand="True">
     <NODE name="NB" expand="False" />
     <NODE name="NC" expand="False" />
     <NODE name="ND" expand="False" />
    </NODE>

    </NODE>のようにEndElementが明示的に記述されているものは
    上記のプログラム内でEndElementの検出が出来るのですが
    2、3、4行目のようなElementの中に情報がないような場合( <NODE ... /> )
    EndElementが検出出来ません。

    何故でしょうか?

    2009年12月9日 8:26

回答

  • 「EndElement ノードは、空の要素に対して生成されません。」だそうです。

    ↓ソース
    XmlTextReader.IsEmptyElement プロパティ
    現在のノードが空の要素 (<MyElement/> など) かどうかを示す値を取得します。
    http://msdn.microsoft.com/ja-jp/library/system.xml.xmltextreader.isemptyelement.aspx
    (抜粋)
    <item num="123"/> (IsEmptyElement が true)。
    <item num="123"> (IsEmptyElement が false。ただし要素の内容は空)。
    対応する EndElement ノードは、空の要素に対して生成されません。

    # XmlDocument クラスは使わないんですね?

    2009年12月9日 8:59
  • 申し訳御座いません・・・解決しました!


    IsEmptyElementの検出位置に問題がありますね。
    アトリビュート情報を取得した後にIsEmptyElementをチェックしても・・・。

    すみません。
    無事に解決できました。
    2009年12月9日 10:35

すべての返信

  • 「EndElement ノードは、空の要素に対して生成されません。」だそうです。

    ↓ソース
    XmlTextReader.IsEmptyElement プロパティ
    現在のノードが空の要素 (<MyElement/> など) かどうかを示す値を取得します。
    http://msdn.microsoft.com/ja-jp/library/system.xml.xmltextreader.isemptyelement.aspx
    (抜粋)
    <item num="123"/> (IsEmptyElement が true)。
    <item num="123"> (IsEmptyElement が false。ただし要素の内容は空)。
    対応する EndElement ノードは、空の要素に対して生成されません。

    # XmlDocument クラスは使わないんですね?

    2009年12月9日 8:59
  • あんにんごさん
     この記事は知ってまして、
     この通りの状況なのですが
     全てのエレメントでIsEmptyElementがfalseなのです。
    2009年12月9日 10:23
  • あんにんごさん

    このヘルプは既に見ておりまして・・・。
    全てのエレメントでIsEmptyElement がfalseなんです。


    while( READER.Read() )
    {
      switch( READER.NodeType )
      {
        case XmlNodeType.Element:
          if( READER.Name.Equals( ELEM_NODE ) )
          {
            // アトリビュート取得
           
            // ここで "/>"でないなら、ある処理をしたい。
          }
          break;
         
        case XmlNodeType.Element:
          return;
      }
    }
    2009年12月9日 10:26
  • 申し訳御座いません・・・解決しました!


    IsEmptyElementの検出位置に問題がありますね。
    アトリビュート情報を取得した後にIsEmptyElementをチェックしても・・・。

    すみません。
    無事に解決できました。
    2009年12月9日 10:35
  • え?!ちょ、最初の質問と違っ…
    ま、ご自身で解決されて何よりです^^;
    2009年12月9日 11:00