2011-07-26 21 views
0

如果我們有一個XML一樣:使用C#/。NET來檢索XML元素的屬性,最好的辦法3.5

<Data> 
    <Cars> 
     <Details> 
     <Dataset se-datafilter="cars" dv-datamanipulationrequired="false" dv-filtercondition="" dv-sortcolumn="" dv-gettopNrows="" /> 
     <XmlData></XmlData> 
     </Details> 
    </Cars> 
    <Jeeps> 
     <Details> 
     <Dataset se-datafilter="jeeps" dv-datamanipulationrequired="false" dv-filtercondition="" dv-sortcolumn="" dv-gettopNrows="" /> 
     <XmlData></XmlData> 
     </Details> 
    </Jeeps> 
</Data> 

什麼是檢索存儲在<Dataset>元素的所有屬性的值的最佳方式爲sMainTagName。 sMainTagName可以具有值「汽車」或「吉普車」。通過用戶界面傳遞。

我現在下面的代碼:

var cols = doc.XPathSelectElements("/Data/" + sMainTagName + "/Details"); 

string sDataFilter = String.Empty; 
string sFilterCondition = String.Empty; 
string sSortCol = String.Empty;       

foreach (var att in cols.Elements("Dataset").Attributes()) 
{       
    switch(att.Name.ToString()) 
    { 
     case "se-datafilter": 
      sDataFilter = att.Value; 
      break; 
     case "dv-filtercondition": 
      sFilterCondition = att.Value; 
      break; 
     case "dv-sortcolumn": 
      sSortCol = att.Value; 
      break; 
    } 
} 
+1

有兩個數據集元素。你還沒有清楚你想要檢索哪一個。 –

+0

@Jon,sMainTagName將決定選擇哪一個。它將會是汽車或吉普車。此外,更新了原始帖子。 –

回答

2

如何返回字典,從屬性建立。

return xdoc.XPathSelectElements("/Data/" + sMainTagName + "/Details/Dataset") 
     .Attributes() 
     .ToDictionary(attr => attr.Name, attr => attr.Value); 
+0

感謝您的解決方案,這很簡單,適合我的情況。儘管如此,其他解決方案也很棒。 –

1

使用以下XPath://Dataset/@*,例如:

var doc = XDocument.Load("a.txt"); 

var sMainTagName = "Cars"; 

string xPath = "Data/" + sMainTagName + "/Details/Dataset/@*"; 

var attr = (doc.Document.XPathEvaluate(xPath) as IEnumerable).Cast<XAttribute>(); 

foreach (var item in attr) 
{ 
    Console.WriteLine("{0}: {1}", item.Name, item.Value); 
} 
3

我的LINQ到XML風扇。這裏有一個例子:

static void Main(string[] args) 
    { 
     var rawXml = 
      @"<Data> 
    <Cars> 
     <Details> 
     <Dataset se-datafilter=""cars"" dv-datamanipulationrequired=""false"" dv-filtercondition="""" dv-sortcolumn="""" dv-gettopNrows="""" /> 
     <XmlData></XmlData> 
     </Details> 
    </Cars> 
    <Jeeps> 
     <Details> 
     <Dataset se-datafilter=""jeeps"" dv-datamanipulationrequired=""false"" dv-filtercondition="""" dv-sortcolumn="""" dv-gettopNrows="""" /> 
     <XmlData></XmlData> 
     </Details> 
    </Jeeps> 
</Data> 
"; 

     var xDoc = XDocument.Parse(rawXml); 

     var filterName = "jeeps"; 
     var attrs = xDoc.Descendants("Dataset").Where(
      x => string.Equals(x.Attribute("se-datafilter").Value, 
       filterName, 
       StringComparison.CurrentCultureIgnoreCase 
     )) 
     .Attributes(); 

     foreach (var attr in attrs) 
     { 
      Console.WriteLine(attr.Value); 
     } 
    } 
} 
2

就我個人而言,我不會使用XPath開始。我會做這樣的事情:

// Note - if an element in this chain doesn't exist, you'll get a 
// NullReferenceException 
var details = doc.Element("Data") 
       .Element(mainTagName) 
       .Element("Details") 
       .Element("Dataset"); 

string dataFilter = ((string) details.Attribute("se-datafilter")) ?? ""; 
string filterCondition= ((string) details.Attribute("dv-filtercondition")) ?? ""; 
string sortCol = ((string) details.Attribute("dv-sortcolumn")) ?? ""; 

(我假設只有一個數據集元素,順便說一句。);

這使用了這樣一個事實,即如果該屬性不存在(即您在空引用上調用該屬性),則XAttribute的顯式字符串轉換將返回null。

相關問題