从Xnode获取读者不起作用

时间:2011-12-11 16:01:25

标签: xml c#-3.0 linq-to-xml

我试图从XNode获取属性我使用以下代码

        XDocument document = XDocument.Load(FilePath);

        var Elements = from p in document.Descendants(modality) select p.Elements("Key_Part");

        //var Attriputess = from p in document.Descendants(modality) select p.Attributes();    
        foreach (var Element in Elements)
        {

            foreach (var node in Element.Nodes())
            {

                XmlReader reader = node.CreateReader();



                string a = reader.GetAttribute("Type"); 


            }



        }

总是等于null 像这样的XML类型

<ShortcutList Version="8">
  <Doctor>
    <Key_Part >
        <Key1 Name = "XX" Type= "XXXXXXXXX" > rrrr</Key1>
        <Key2 Name = "XasfsaX" Type= "XXXXsafasfXXXXX" > rrsfsfrr</Key1>
    </Key_Part>

我想获得Key1,Key2属性和值       

2 个答案:

答案 0 :(得分:1)

我必须说我已经修复了你在下面的工作查询之前提供的XML。因此,您尚未关闭最后两个代码,并且已通过Key2标记</Key1>标记了什么是错误的XML。

尝试以下操作,这将返回条目列表(每个键一个),其中每个具有属性的匿名类型条目:名称,值,类型

var keys = xdoc.Descendants("ShortcutList")
               .Descendants("Doctor")
               .Descendants("Key_Part")
               .DescendantNodes()
               .OfType<XElement>()
               .Where(d => d.Name.LocalName.Contains("Key"))
               .Select(e => new {
                                 Value = e.Value, 
                                 Name = e.Attribute("Name").Value, 
                                 Type = e.Attribute("Type").Value
                                })
              .ToList();

编辑:修正了XML

<ShortcutList Version="8">
  <Doctor>
    <Key_Part >
        <Key1 Name = "XX" Type= "XXXXXXXXX" > rrrr</Key1>
        <Key2 Name = "XasfsaX" Type= "XXXXsafasfXXXXX" > rrsfsfrr</Key2>
    </Key_Part>
</Doctor>
</ShortcutList>

答案 1 :(得分:0)

在开始获取属性之前,您需要确保阅读器位于元素上。但是,除非您有充分的理由这样做,否则您根本不需要XmlReader来获取属性值。

编辑添加请求的示例:

foreach (var a in document.Descendants(modality).Elements("Key_Part").Select(e => e.Attribute("Type").Value)) {
    // the variable a is a string with the attribute value
}

或者像这样:

foreach (var attr in document.Descendants(modality).Elements("Key_Part").Attributes("Type")) {
    string a = attr.Value;
}