簡體   English   中英

獲取 xml 標簽的值

[英]get the value of a xml tag

在下面的 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());
}

請幫我做一些其他的選擇。

我會避免使用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元素,您的輸出中最終會出現一個空元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM