web-dev-qa-db-ja.com

XmlReaderで属性値を読み取る

here から読み取ろうとしているXMLファイルがあり、次のコードがあります。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;

namespace XML
{
    class Program
    {
        static void Main(string[] args)
        {
            XmlTextReader textReader = new XmlTextReader("secLendingXML.cfm.xml");
            while (textReader.Read())
            {
                switch (textReader.NodeType)
                {
                    case XmlNodeType.Element:
                        Console.WriteLine(textReader.Name);
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.Text:
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.XmlDeclaration:
                    case XmlNodeType.ProcessingInstruction:
                        Console.WriteLine(textReader.Name + " " + textReader.Value);
                        break;
                    case XmlNodeType.Comment:
                        Console.WriteLine(textReader.Value);
                        break;
                    case XmlNodeType.EndElement:
                        break;
                }
            }
            Console.ReadLine();
        }
    }
}

コードは、ノードを読み取り、名前を返すという意味で適切に機能しています。しかし、問題は、ノード内のデータも取得しようとしていることです。つまり、テストセクションの後の最初のセクションを読み取ると、次のようになります。

slnc:DataSet
slnc:Group
slnc:Section
slnc:ActualAvailableToBorrow
*** here ***
slnc:oustandingLoans

これは、textreaderがconfidentiality="F"currency="USD"などのノード内の次の値を読み取る場所ですが、これらの値を読み取らずに次のセクションにスキップします!

<slnc:actualAvailableToBorrow xmlns:slnc="http://www.newyorkfed.org/xml/schemas/SecLending" 
      confidentiality="F" currency="USD" decimals="0" method="AA" 
      multiplier="5" securityLendingType="AA" status="A" value="1474"/>

Textreaderで属性値を読み取るにはどうすればよいですか?値「通貨」を印刷してから、その値「F」などを印刷することが理想的です。

18
weskpga

単一の名前付き属性を取得する

XmlTextReader.GetAttribute(MSDN) を使用します

case XmlNodeType.Element:
  Console.WriteLine(textReader.Name);
  Console.WriteLine(textReader.Value);
  Console.WriteLine(textReader.GetAttribute("currency"));

この関数の優れた機能の1つは、属性が定義されていない場合は例外が発生しないことです。Nullを返すだけです。

すべての属性を取得する

XmlTextReader.MoveToAttribute(MSDN) を使用します

AttributeCountプロパティをMoveToAttributeと組み合わせて使用​​します。

case XmlNodeType.Element:
  Console.WriteLine(textReader.Name);
  Console.WriteLine(textReader.Value);
  for (int attInd = 0; attInd < textReader.AttributeCount; attInd++){
      textReader.MoveToAttribute( attInd );
      Console.WriteLine(textReader.Name);
      Console.WriteLine(textReader.Value);
  }
  textReader.MoveToElement(); 
46
JDB

ループ条件を少し変更して、属性を反復処理することもできます。

while (textReader.MoveToNextAttribute() || textReader.Read())
{ 
     switch (textReader.NodeType)
     {
         case XmlNodeType.Element:
             Console.WriteLine(textReader.Name);
             Console.WriteLine(textReader.Value);
             break;
         //...
         case XmlNodeType.Attribute:
             //use textReader.Name and textReader.Value here for attribute name and value
             break;
    }
}

MoveToNextAttributeメソッドは、リーダーを現在の要素の次の属性に進めるか、そうできない場合はfalseを返します。

15
ghord