通过c#获取xml节点属性

时间:2013-09-23 06:59:44

标签: c# xml linq properties

如何获取节点属性?因此,我使用Linq To Xml来解析文件。 我试着这样做:

// load doc and then give elements.
XDocument doc = XDocument.Load(pathToFile);
var elem = doc.Root
              .Elements("mode")
              .Where(o => o.Attribute("name") != null)
              .Elements("file")
              .Where(k => k.Attribute("name") !=null && k.Attribute("name").Value == filenameTag)
              .Elements("model")
              .Where(o => o.Attribute("name") != null)
              .Elements("class")
              .Where(c => c.Attribute("name") != null);


foreach (var el in elem)
{
    Console.WriteLine("First Attribute "+el.FirstAttribute.ToString());
    Console.WriteLine("Name "+el.Name);
    Console.WriteLine("Last Attribute " + el.LastAttribute.ToString());

    var nodes=el.Nodes();
    foreach (var node in nodes)
    {
        Console.WriteLine("node "+node.ToString());
    }

}

Xml文件:

  <modes>
    <mode name="mode1">
      <file name="file1.xml">
        <model name="Config" AllClasses="false">
          <ignore.class class="class5"/>
          <class name="class1" allProprs="true"/>
          <class name="class2" allProps="false">
              <property name="pr1"/>
              <ignore.property property="pr2"/>
           </class>
         </model>
       </file> 
    </mode>
</modes>

所以,我只得到这样的字符串:

node <property name="pr1" />
node <ignore.property property="pr2" />

但如何获得价值&#34; pr1&#34;和&#34; pr2&#34;?

谢谢!

3 个答案:

答案 0 :(得分:2)

在显示时:

node <property name="pr1" />
node <ignore.property property="pr2" />

您正在迭代<class>。如果要获取子元素的属性,则询问子元素的属性

foreach (var attrib in el.Elements().Attributes())
{
    Console.WriteLine("node " + (string)attrib);
}

根据要求输出pr1pr2

答案 1 :(得分:1)

您的问题是您只需编写类的内部元素的ToString表示。这为您提供了属性元素的全部内容。但是你应该得到每个属性元素的第一个属性的

var xdoc = XDocument.Load(path_to_xml);
string filenameTag = "file1.xml";
var classes = xdoc.Descendants("file")
                  .Where(f => (string)f.Attribute("name") == filenameTag)
                  .Elements("model")
                  .Where(m => (string)m.Attribute("name") != null)
                  .Elements("class")
                  .Where(c => (string)c.Attribute("name") != null);

foreach (var c in classes)
{
    Console.WriteLine("Name: " + (string)c.Attribute("name"));
    foreach(var p in c.Elements())
       Console.WriteLine("Property: " + (string)p.Attributes().FirstOrDefault());
}

输出:

Name: class1
Name: class2
Property: pr1
Property: pr2

BTW用XPath编写这个查询要容易得多:

string xpath = String.Format("//file[@name='{0}']/model[@name]/class[@name]", filenameTag);
var classes = xdoc.XPathSelectElements(xpath);

答案 2 :(得分:0)

您可以使用XPath查询并询问XML文档。另一个选择是获取XmlNode,然后从节点中提取属性。

它不是LINQ,但它有效。