簡體   English   中英

使用XmlDocument獲取字符串或變量中特定類型的內部標簽的值

[英]To get the values of innertag of a particular type in a string or variable using XmlDocument

在下面的xml中,

<?xml version="1.0" encoding="utf-8"?>
<Models>
    <Model  DESC="HONDA-BLUE-450"  MODELID="XX12-01"  Status="in" />
    <Model  DESC="VOLKS--RED-345"  MODELID="XY12-01"  Status="in" />
    <Model  DESC="BENZ-BLUE-550"  MODELID="XX12-01"  Status="in" />
    <Model  DESC="VOLKS--CYAN-345"  MODELID="BG12-01"  Status="out" />
    <Model  DESC="HONDA-GREEN-234"  MODELID="AX12-01"  Status="in" />
    <Model  DESC="VOLKS-Yellow-765"  MODELID="XY11-01"  Status="in" />
    <Model  DESC="HONDA-GREEN-109"  MODELID="AC12-01"  Status="in" />
    <Model  DESC="AUDI-GREEN-984"  MODELID="AF42-01"  Status="in" />
    <Model  DESC="VOLKS-Yellow-565"  MODELID="XJ11-61"  Status="out" />
    <Model  DESC="HONDA-WHITE-079"  MODELID="DC12-38"  Status="in" />
    <Model  DESC="TOYOTA-GREY-109"  MODELID="UC12-81"  Status="in" />
    <Model  DESC="AUDI-CYAN-984"  MODELID="LF42-41"  Status="in" />
    <Model  DESC="VOLKS-WHITE-865"  MODELID="LK11-61"  Status="out" />
    <Model  DESC="HONDA-GREY-039"  MODELID="PC12-31"  Status="in" />
</Models>

我想獲取所有狀態為MODELID且DESC以VOLKS開頭的值。 任何幫助,將不勝感激。

您可以使用linq到xml來遍歷xml節點和String.StartsWith來檢查屬性DESC值是否以“ VOLKS”開頭:

XDocument xdoc = XDocument.Load("data.xml");
var modelIds= from c in xdoc.Descendants("Model")
              where c.Attribute("DESC").Value.StartsWith("VOLKS")  &&
               c.Attribute("Status").Value == "out"
              select c.Attribute("MODELID").Value;

或者使用正則表達式來具有SQL LIKE

XDocument xdoc = XDocument.Load("data.xml"));
var modelIds= from c in xdoc.Descendants("Model")
              where c.Attribute("DESC").Value.Like("VOLKS%")  &&
               c.Attribute("Status").Value == "out"
              select c.Attribute("MODELID").Value;

對LIKE使用正則表達式:

public static class MyStringExtensions
{
public static bool Like(this string toSearch, string toFind)
{
    return new Regex(@"\A" + new Regex(@"\.|\$|\^|\{|\[|\(|\||\)|\*|\+|\?|\\").Replace(toFind, ch = > @"\" + ch).Replace('_', '.').Replace(" % ", ".*") + @"\
            z ", RegexOptions.Singleline).IsMatch(toSearch);
 }
}

像源

您沒有提到LINQ是否還可以。 這是使用LINQ,foreach和XPATH的方法。 (以增強Mihai已發布的報道)。

    static void Main(string[] args)
    {
        XmlDocument xd = new XmlDocument();
        xd.Load("Models.xml");
        var result = from XmlNode row in xd.DocumentElement.SelectNodes("//Model[starts-with(@DESC, 'VOLKS') and @Status='out']") where row != null select row;
        foreach (var x in result)
        {
            XmlAttributeCollection attributes = x.Attributes;
            Console.Write("<Model ");
            foreach (XmlAttribute attribute in x.Attributes)
            {
                Console.Write("{0}=\"{1}\"  ", attribute.Name, attribute.Value);
            }
            Console.WriteLine(" />");
        }
    }

帶有lambda的Linq to XML解決方案:

var query = XDocument.Load("data.xml").Root.Elements("Model")
   .Where(m => m.Attribute("Status").Value == "out" && m.Attribute("DESC").Value.StartsWith("VOLKS")) 
   .Select(m => m.Attribute("MODELID").Value);

foreach (var v in query)
    Console.WriteLine(v);

//  output:
//    BG12-01
//    XJ11-61
//    LK11-61

暫無
暫無

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

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