2014-03-13 33 views
0

n中的如下XML形式獲取特定類型的innertag的值在字符串或變量,要使用XmlDocument的

<?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開始。任何幫助,將不勝感激。

+0

看這個問題http://stackoverflow.com/questions/21399599/reading-a-particular-config-element-using-c/21401100#21401100 –

回答

1

您可以使用LINQ到XML來經歷XML節點和String.StartsWith來檢查atttribute 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); 
} 
} 

LIKE source

+0

我想要得到其DESC爲「VOLKS」的MODELID的值。 – user3265656

+0

更新了我的答案。 –

0

你沒有提到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(" />"); 
     } 
    } 
+0

謝謝,我們如何在wpf中編寫相同的代碼! – user3265656

0

一個LINQ與lambda表達式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