如何使用XmlReader从XML中的特定子元素获取值

时间:2016-07-29 06:49:26

标签: c# .net xml xmlreader

这是XML

<?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>

那我怎么能得到DownLoad_Speed的价值&gt; &安培; UpLoad_Speed&GT;给定Coverage ID Urban的元素&gt;和技术ID UMTS900&gt;?比方说,如果我给出技术ID值=&#34; UMTS900&#34;和覆盖率id值&#34; Urban&#34;,我希望字符串值为dwnload_speed = 13,Upload_Speed = 14。

4 个答案:

答案 0 :(得分:2)

使用LinqXml

    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")
                    });

选中此Demo

答案 1 :(得分:0)

您需要打开XML文档

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

一旦你获得了节点,你就可以用它做必要的事情

答案 2 :(得分: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);
   }

答案 3 :(得分:0)

这是使用XmlReader和xml linq

的解决方案
SWITCHOFFSET(CONVERT(datetimeoffset, <DateColumn>), DATENAME(TzOffset, SYSDATETIMEOFFSET()))