2011-07-26 10 views
0

我々のようなXMLを使用している場合:。/ネットC#を使用して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は、値 "Cars"または "Jeeps"のいずれかを持つことができます。 UIから渡されます。

私は今、次のコードを持っている:

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

データセット要素は2つあります。検索したいものを明確にしていません。 –

+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

私はXMLにLINQののファンです。ここに例があります:

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")) ?? ""; 

(私はそこにただ1つのDataset要素があると仮定しています)。

これは、属性が存在しない場合(null参照で呼び出す場合)、明示的な文字列変換XAttributeはnullを返します。

関連する問題