2013-09-23 212 views
0

如何獲取節點屬性?所以,我使用Linq To Xml來解析文件。 我嘗試做這樣的:通過c#獲取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」?

謝謝!

回答

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); 
0

您可以使用XPath查詢並詢問您的XML文檔。另一種選擇是獲取XmlNode,然後從節點中提取屬性。

這不是LINQ,但它的工作原理。

2

在正在顯示的時間:

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

您在迭代<class>。如果你想獲得的子元素的屬性,那麼索要子元素的屬性:

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

,輸出:pr1pr2,按要求