2010-05-24 6 views
7

Ich habe die folgende XML:Wie zu Suchen und Navigieren XML-Knoten

<LOCALCELL_V18 ID = "0x2d100000"> 
    <MXPWR ID = "0x3d1003a0">100</MXPWR> 
</LOCALCELL_V18> 
<LOCALCELL_V18 ID = "0x2d140000"> 
    <MXPWR ID = "0x3d1403a0">200</MXPWR> 
</LOCALCELL_V18> 
<LOCALCELL_V18 ID = "0x2d180000"> 
    <MXPWR ID = "0x3d1803a0">300</MXPWR> 
</LOCALCELL_V18> 

Ich mag den Text um jeden <MXPWR> erhalten. Es ist jedoch nicht zulässig, ID # zu verwenden, um den inneren Text zu finden, da dieser nicht immer derselbe ist. Hier ist mein Code:

XmlNodeList LocalCell = xmlDocument.GetElementsByTagName("LOCALCELL_V18"); 

foreach (XmlNode LocalCell_Children in LocalCell) 
{ 
    XmlElement MXPWR = (XmlElement)LocalCell_Children; 
    XmlNodeList MXPWR_List = MXPWR.GetElementsByTagName("MXPWR"); 
    for (int i = 0; i < MXPWR_List.Count; i++) 
    { 
     MaxPwr_form_str = MXPWR_List[i].InnerText; 
    } 
} 

Jede Meinung wird geschätzt.

Antwort

8

Ich würde xpath verwenden. Es wurde für genau diese Art von Problem entwickelt. Etwas wie:

using System.Xml; 
using System.Xml.XPath; 
.... 
string fileName = "data.xml"; // your file here 
XPathDocument doc = new XPathDocument(fileName); 
XPathNavigator nav = doc.CreateNavigator(); 

// Compile an xpath expression 
XPathExpression expr = nav.Compile("./LOCALCELL_V18/MXPWR"); 
XPathNodeIterator iterator = nav.Select(expr); 

// Iterate on the node set 
while (iterator.MoveNext()) 
{ 
    string s = iterator.Current.Value; 
} 

Wenn ich dies auf dem XML-Datei ausführen (eingewickelt in einem Wurzelknoten) erhalte ich:

s = 100 
s = 200 
s = 300 
4

Ich würde XLinq verwenden:

using System.Xml.Linq; 

var xDoc = XDocument.Load("data.xml"); 

var mxpwrs = xDoc.Descendants("MXPWR"); 
foreach (var mxpwr in mxpwrs) 
{ 
    Console.WriteLine(mxpwr.Value); 
} 
+0

Perfekte Verwendung für Linq um die Notwendigkeit für Xpath zu beseitigen. –

Verwandte Themen