2012-07-23 221 views
1

我如何可以讀取XML文件中有內容:如何讀取XML文件節點屬性和子節點屬性值?

<?xml version="1.0" encoding="utf-8"?> 
<A> 
    <B value="1"> 
    <Hash algo="SHA256" value="905C45B51B970434D7159641D9F6A88DC91E9C35030618A729C8E4BE174711AF" /> 
    </B> 
    <B value="2"> 
    <Hash algo="SHA256" value="649721FF455E9B100E691A3857696350E14364029C34C9438AB3EA9665C91292" /> 
    </B> 
    <B value="3"> 
    <Hash algo="SHA256" value="90FC91C4B82BF440FDAFECF3303DCA8FB9F2E9D7EFFAE394D8B74D0C7CD7DA10" /> 
    </B> 
</A> 

在上面的xml文件我想讀的所有B標籤的「價值」的價值屬性值和標籤Hash「算法」或「價值」屬性值。

這裏是我使用的代碼:

 var settings = new XmlReaderSettings(); 
     settings.IgnoreWhitespace = true; 
     using (var stm = new FileStream(@"xmlFilePath", FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (var reader = XmlReader.Create(stm, settings)) 
     { 
      while (reader.Read()) 
      { 
       string srcFileHash=null; 
       reader.ReadToDescendant("B"); 
       if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "B") 
       { 
        reader.MoveToAttribute("value"); 
        var bValue=reader.Value; // get the B tag attribute value. 

        //also want to read the <hash value=? and algo=?. but I dnt know how to get these hash tag attributes. 
       } 
      } 
     } 
+1

大家好,非常歡迎這樣的!你有什麼嘗試過自己?有幾種不同的方法可以使用.NET庫以及第三方庫來讀取和解析XML。如果您嘗試查看右下方的相關問題,我確信已經有幾個答案可用。 =) – 2012-07-23 11:47:54

+0

這裏有很多例子可以幫你:[如何:用XmlReader解析XML](http://msdn.microsoft.com/en-us/library/cc189056(v = vs.95).aspx) – Schaliasos 2012-07-23 11:50:17

+0

我認爲沒有理由投下這個問題它是合法的,是它的舊和它在世界的每本書中,但我們可以通過提供一個合法的答案來幫助這個人。 – 2012-07-23 12:03:01

回答

2
XDocument xDoc = XDocument.Parse(xml); 
var result = xDoc.Descendants("B") 
    .Select(b => new 
    { 
     BValue = b.Attribute("value").Value, 
     Alg = b.Element("Hash").Attribute("algo").Value, 
     AlgValue = b.Element("Hash").Attribute("value").Value, 
    }) 
    .ToArray(); 
+0

voila一linq解決方案:) – 2012-07-23 12:10:28

+0

upvoted,因爲我認爲這是相當優雅 – 2012-07-23 12:22:28

0

你的問題還不清楚,但這裏是一些簡單的代碼,做你想做什麼。

XDocument xdoc = XDocument.Load(@"file.xml"); 
if (xdoc.Root != null) 
{ 
    var bs = xdoc.Root.Descendants("B"); 

    foreach (var bNode in bs) 
    { 
     Console.Out.WriteLine("B Value: " + bNode.FirstAttribute.Value); 
     var hash = bNode.XPathSelectElement("Hash"); 
     Console.Out.WriteLine("algo is : " + hash.FirstAttribute.Value); 
     Console.Out.WriteLine("value is : " + hash.FirstAttribute.NextAttribute.Value); 
    } 
} 

我建議對的XDocument和XmlDocument的刷牙(兩者都仍然適用取決於多大你的代碼:)

2
XElement doc = XElement.Load(yourxmlfilename);//Load the document 

foreach (XElement b in doc.Elements("B"))//Iterate all elements B 
{ 
    var xAttribute = b.Attribute("value");//get attribute called value 
    if (xAttribute != null) 
    { 
     string v = xAttribute.Value;//now you have the B value 
    } 

    foreach (XElement h in b.Elements("Hash"))//Iterate all elements Hash 
    { 
     var xAttributev = h.Attribute("value");//get attribute called value 
     if (xAttributev != null) 
     { 
       string hashValue = xAttribute.Value;//now you have the Hash value 
     } 

     var xAttributeh = h.Attribute("algo");//get attribute called algo 
     if (xAttributeh != null) 
     { 
      string algorithm = xAttributeh.Value;//now you have the Hash algorithm 
     } 
    } 
} 
+0

請解釋爲什麼反對 – HatSoft 2012-07-23 12:26:01

+0

請解釋-1爲我看不出什麼問題與我的回答 – HatSoft 2012-07-23 14:01:29

+0

我沒有downvote你,但賠率是好的downvote是因爲它是一個代碼唯一的答案。我們更喜歡人們使用文字來解釋問題,而不是僅僅發佈代碼。 – 2012-07-24 23:14:03