2017-12-25 7 views
1

に存在する場合:チェックノードは、私はこのXMLを持っているXDocument

<Rejectedparameters> 
    <parameter> 
    <name>CO</name> 
    <value>5.34</value> 
    </parameter> 
    <parameter> 
    <name>CO2</name> 
    <value>10.1</value> 
    </parameter> 
    <parameter> 
    <name>HC</name> 
    <value>473</value> 
    </parameter> 
    <parameter> 
    <name>O2</name> 
    <value>2</value> 
    </parameter> 
</Rejectedparameters> 

私は例えばノードが存在するかどうかを確認する必要がある - このように:

int Gvalue = (from x in document.Elements("Rejectedparameters").Elements("parameter") 
       from p in x.Elements("Name") 
       where x.Element("CO").Value.ToString() != string.Empty 
       select x).Count(); 

が、g値が0である - なぜ?ご覧のとおり、COはXMLに存在します。

+1

'Name'と' name'は同じではありません - XMLでは大文字と小文字が区別されます。さらに、 "CO"という*要素*を見つけようとしていますが、その要素はドキュメントにありません。 –

答えて

8

最初に、各parameter要素は1つの名前しか持たないので、そのためにはElementを使用してください。

次に、ご希望の要素としてnameを使用してください。Nameではありません。

最後に、あなたはCO、ないCOと呼ばれる要素を探しています。だから、あなたのようなものがあるだろう:私はあなたが空の文字列のチェックをやろうとしていたもので、推測してきました

var query = doc 
    .Root 
    .Elements("parameter") 
    .Where(parameter => (string) parameter.Element("name") == "CO" && 
         !string.IsNullOrEmpty((string) parameter.Element("value")); 
var count = query.Count(); // It's not clear why this was Gvalue in your original code 

を...あなたは、フィルタの第2の部分を必要としないかもしれません。私はあなたがしか持っていないと仮定しました。は実際に要素を使いたいと思っています。

別のアプローチは、最初のクエリですべてのパラメータを変換することであろう。

1
var parameters = doc.Root.Elements("parameter").Select(p => 
    new { Name = (string) p.Element("name"), Value = (string) p.Element("value") }); 
// Just as an example... 
var co = parameters.SingleOrDefault(p => p.Name == "CO"); 

まず、COが要素ではありません。それは価値です。クエリを変更する必要があります。

var gValue = document.Descendants("name").Count(x => x.Value == "CO"); 
Output : 1 
関連する問題