获取xml标签的值

时间:2018-12-06 08:48:49

标签: c# xml

在下面的xml中,我想获取名称标签具有的标签ID的值  值“ HighLevelReport%”。

<RunResults xmlns="http://www.hp.com/PC/REST/API">
  <RunResult>
    <ID>17245</ID>
    <Name>output.mdb.zip</Name>
    <Type>Output Log</Type>
    <RunID>4196</RunID>
  </RunResult>
  <RunResult>
    <ID>17246</ID>
    <Name>VuserLog.zip</Name>
    <Type>Output Log</Type>
    <RunID>4196</RunID>
  </RunResult>                            
  <RunResult>
    <ID>17248</ID>
    <Name>Reports.zip</Name>
    <Type>HTML Report</Type>
    <RunID>4196</RunID>
  </RunResult>
  <RunResult>
    <ID>17249</ID>
    <Name>HighLevelReport_4196.xls</Name>
    <Type>Rich Report</Type>
    <RunID>4196</RunID>
  </RunResult>                          
</RunResults>

当前我正在使用数据集获取值

using (DataSet reader = ds.ReadXml(xml))
{                               
    DataRow[] DR = reader.Tables[0].Select("Name like '%HighLevelReport%'");
    int testID = Convert.ToInt32(DR[0].ItemArray[0].ToString());
}

请帮我做一些其他的选择。

1 个答案:

答案 0 :(得分:3)

除非您确实需要,否则我将避免使用DataSet。如果您只是在处理XML,请使用XML API。我发现LINQ to XML最适合此目的。例如:

XNamespace ns = "http://www.hp.com/PC/REST/API";
var doc = XDocument.Parse(xml);
var ids = doc.Root
             .Elements(ns + "RunResult")
             .Where(rr => ((string) rr.Element(ns + "Name"))?.StartsWith("HighLevelReport") ?? false)
             .Select(rr => (string) rr.Element(ns + "RunID"));

这是一个完整的例子:

using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;

public class Program
{
    public static void Main()
    {
        // Alternatively, use XDocument.Load to load from a file
        string xml = File.ReadAllText("test.xml");
        var doc = XDocument.Parse(xml);
        XNamespace ns = "http://www.hp.com/PC/REST/API";
        var ids = doc.Root
            .Elements(ns + "RunResult")
            .Where(rr => ((string) rr.Element(ns + "Name"))?.StartsWith("HighLevelReport") ?? false)
            .Select(rr => (string) rr.Element(ns + "RunID"));
        foreach (var id in ids)
        {
            Console.WriteLine(id);
        }
    }
}

此处的Where子句处理缺少的Name元素-对string的强制转换将返回null,因此不会调用StartsWith。如果缺少RunID元素,则输出中将以null元素结束。