2016-07-29 14 views
0

Hier wird die XML-Wie Wert von einem bestimmten Kind-Elemente in XML erhalten XmlReader

<?xml version="1.0" encoding="UTF-8"?> 
<Data_Speed> 
<Tech ID = "UMTS"> 
    <Coverage ID="Dense_Urban"> 
     <DownLoad_Speed>10</DownLoad_Speed> 
     <Upload_Speed>20</Upload_Speed> 
    </Coverage> 
    <Coverage ID="Urban"> 
     <DownLoad_Speed>30</DownLoad_Speed> 
     <Upload_Speed>40</Upload_Speed> 
    </Coverage> 
    <Coverage ID="SubUrban"> 
     <DownLoad_Speed>50</DownLoad_Speed> 
     <Upload_Speed>60</Upload_Speed> 
    </Coverage> 
</Tech> 
<Tech ID = "UMTS900"> 
    <Coverage ID="Dense_Urban"> 
     <DownLoad_Speed>11</DownLoad_Speed> 
     <Upload_Speed>12</Upload_Speed> 
    </Coverage> 
    <Coverage ID="Urban"> 
     <DownLoad_Speed>13</DownLoad_Speed> 
     <Upload_Speed>14</Upload_Speed> 
    </Coverage> 
    <Coverage ID="SubUrban"> 
     <DownLoad_Speed>15</DownLoad_Speed> 
     <Upload_Speed>16</Upload_Speed> 
    </Coverage> 
</Tech> 
<Tech ID = "4G800"> 
    <Coverage ID="Dense_Urban"> 
     <DownLoad_Speed>30</DownLoad_Speed> 
     <Upload_Speed>42</Upload_Speed> 
    </Coverage> 
    <Coverage ID="Urban"> 
     <DownLoad_Speed>50</DownLoad_Speed> 
     <Upload_Speed>34</Upload_Speed> 
    </Coverage> 
    <Coverage ID="SubUrban"> 
     <DownLoad_Speed>45</DownLoad_Speed> 
     <Upload_Speed>46</Upload_Speed> 
    </Coverage> 
    <Coverage ID="Rural"> 
     <DownLoad_Speed>47</DownLoad_Speed> 
     <Upload_Speed>48</Upload_Speed> 
    </Coverage> 
    <Coverage ID="Variable"> 
     <DownLoad_Speed>15</DownLoad_Speed> 
     <Upload_Speed>52</Upload_Speed>  
    </Coverage> 
    <Coverage ID="Outdoor"> 
     <DownLoad_Speed>25</DownLoad_Speed> 
     <Upload_Speed>22</Upload_Speed> 
    </Coverage> 
</Tech> 
</Data_Speed> 

So wie ich Wert von DownLoad_Speed> & UpLoad_Speed ​​gegeben Coverage ID Urban> und Tech ID UMTS900> -Element bekommen könnte >? Sagen wir, wenn ich die technische ID value = "UMTS900" und den Coverage-ID-Wert "Urban" gebe, hätte ich gerne den String-Wert dwnload_speed = 13 und Upload_Speed ​​= 14 als Ergebnis.

+0

[Klick] (http://stackoverflow.com/q/6442024/1997232), [hier klicken] (http://stackoverflow.com/q/ 14207811/1997232), [click] (http://stackoverflow.com/q/36913069/1997232) ... – Sinatr

Antwort

0

Sie müssen XML-Dokument

XmlDocument _document = new XmlDocument(); 
byte[] bytes = File.ReadAllBytes(filePath); 
string xml = Encoding.UTF8.GetString(bytes); 
try 
{ 
_document.LoadXml(xml); 
} 
catch (XmlException e) 
{ 
//exception handling 
}     

var doc = (XmlDocument)_document.CloneNode(true); 

XmlNode node = doc.GetElementsByTagName("your child node name"); 

öffnen Sobald Sie Ihren Knoten erhalten, dann können Sie mit es notwendig, was zu tun

1

Mit Linq zu Xml

XDocument doc = XDocument.Load(filepath); 

    //ex... 
    string technology = "UMTS900"; 
    string coverage = "Dense_Urban"; 

    var result = doc.Descendants("Tech") 
     .Where(x=> (string)x.Attribute("ID") == technology) 
     .Elements("Coverage") 
     .Where(x=>(string)x.Attribute("ID")== coverage) 
     .Select(x=> new 
        { 
         Dowload_Speed = (string)x.Element("DownLoad_Speed"), 
         Upload_Speed = (string)x.Element("Upload_Speed") 
        }); 

prüfen diese Demo

+0

Tipp: Sie können die expliziten Konvertierungen verwenden, um die Null-Überprüfung zu vermeiden, z 'x => (string) x.Attribute (" ID ") == technology' –

+0

Danke Hari Prasad für schnelle Antwort :) –

+0

Können wir dasselbe mit Javascript @Hari Prasad erreichen? –

0
string techId = "UMTS900"; 
string coverageId = "SUBURBAN"; 
int downloadSpeed = 0; 
int uploadSpeed = 0; 

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.Load(@"C:\....\DataSpeed.xml"); 
XmlNodeList techTags = xmlDoc.GetElementsByTagName("Tech"); 

foreach (XmlNode techTag in techTags) 
{ 
    if (techTag.Attributes["ID"].Value.Equals(techId,StringComparison.OrdinalIgnoreCase)) 
    { 
     XmlNodeList coverageTags = techTag.ChildNodes; 
     foreach (XmlNode coverageTag in coverageTags) 
     { 
     if (coverageTag.Attributes["ID"].Value.Equals(coverageId, StringComparison.OrdinalIgnoreCase)) 
     { 
      downloadSpeed =Convert.ToInt16(coverageTag.ChildNodes[0].InnerText); 
      uploadSpeed = Convert.ToInt16(coverageTag.ChildNodes[1].InnerText); 
      break; 
      } 
     } 
     break; 
    } 
} 

    if (downloadSpeed == 0 && uploadSpeed == 0) 
    { 
     Console.WriteLine("Specified Tech Id and Coverage Id not found"); 
    } 
    else 
    { 
     Console.WriteLine("Download Speed is {0}. Upload Speed is {1}.",downloadSpeed,uploadSpeed); 
    } 
0

Hier wird Lösung XmlReader mit xml linq

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Xml; 
using System.Xml.Linq; 


namespace ConsoleApplication4 
{ 
    class Program 
    { 
     const string FILENAME = @"c:\temp\test.xml"; 
     static void Main(string[] args) 
     { 

      XmlReader reader = XmlReader.Create(FILENAME); 
      string id = "UMTS900"; 
      object coverages = null; 
      while (!reader.EOF) 
      { 
       if (reader.Name != "Tech") 
       { 
        reader.ReadToFollowing("Tech"); 
       } 
       if (!reader.EOF) 
       { 
        XElement tech = (XElement)XElement.ReadFrom(reader); 
        if((string)tech.Attribute("ID") == id) 
        { 
         coverages = tech.Descendants("Coverage").Select(x => new 
         { 
          id = (string)x.Attribute("ID"), 
          downLoad_Speed = (int)x.Element("DownLoad_Speed"), 
          upLoad_Speed = (int)x.Element("Upload_Speed"), 
         }).ToList(); 
         break; 
        } 
       } 
      } 



     } 
    } 

}