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」などを印刷することが理想的です。
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();
ループ条件を少し変更して、属性を反復処理することもできます。
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を返します。