Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XmlReader读取属性值_C#_Xml_Xmlreader - Fatal编程技术网

C# 使用XmlReader读取属性值

C# 使用XmlReader读取属性值,c#,xml,xmlreader,C#,Xml,Xmlreader,我有一个试图读取的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) { XmlTe

我有一个试图读取的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在节点中读取以下值的地方,如
security=“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读取属性值?它最好先打印值“currency”,然后再打印值“F”,以此类推。

获取一个命名的属性 使用

此函数的一个很好的特性是:如果未定义属性,它将不会导致异常-它只返回
Null

获取所有属性 使用

将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(); 
case-XmlNodeType.Element:
Console.WriteLine(textReader.Name);
Console.WriteLine(textReader.Value);
for(int-attInd=0;attInd
您可以稍微更改循环条件,使其也可以遍历属性:

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。

谢谢,这正是我要查找的。只是一个简单的后续问题-您知道是否有一个函数可以获取节点中的每个属性,还是我必须手动执行此操作?我认为可能性能会稍高一些,因为您不必在读取属性后倒带文本读取器。但我还没有测试过,所以我不知道它有多大的区别(可能不会太大)。我建议您选择使代码易于阅读的选项,然后在测试显示出明显的性能瓶颈时进行重构。这是一个好主意,我尝试在没有结果的情况下进行测试,但没有注意到
while
语句
textReader.MoveToNextAttribute()
中添加的关键内容!
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;
    }
}