0

如何获取节点属性?所以,我使用 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" />

但是如何获得值“pr1”和“pr2”?

谢谢!

4

3 回答 3

2

显示的时候:

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

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

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

哪个输出:pr1pr2,根据要求

于 2013-09-23T07:09:10.563 回答
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

顺便说一句,用 XPath 编写这个查询要容易得多:

string xpath = String.Format("//file[@name='{0}']/model[@name]/class[@name]", filenameTag);
var classes = xdoc.XPathSelectElements(xpath);
于 2013-09-23T07:07:03.343 回答
0

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

它不是 LINQ,但它可以工作。

于 2013-09-23T07:03:13.720 回答