1

私は LINQ をまったく使用したことがなく、LINQ to XML の学習を開始したいと考えています。ドキュメントを読み、オンラインで回答を見つけようとしましたが、役に立ちませんでした。

これは私が使用する XML です。

<?xml version="1.0" encoding="utf-8" ?>
<parameters>
  <view name="some_view">
    <col name="name">
      <width>150</width>
    </col>
  </view>
  <view name="anotherview">
    <col name="colname">
      <format>D12</format>
    </col>
  </view>
</parameters>

viewそして、次のようにビューのノードをフェッチしようとしますsome_view:

XElement root = XElement.Load("params.xml");
var test = from _view in root.Descendants("view") where 
     _view.Attribute("name").Equals("some_view") select _view;

rootを呼び出すと 2 つのノードが得られるため、要素はそこにありますroot.Descendants("view")viewしかし、上記のように LINQ を実行すると、結果が得られず、XML から最初のノードを取得することが期待されます。

4

5 に答える 5

4

を見逃していたと思います。Value属性から:

var test = (from _view in xml.Descendants("view")
            where _view.Attribute("name") != null && _view.Attribute("name").Value == "some_view" 
            select _view).SingleOrDefault();

あなたが望むことをします

于 2013-09-09T11:50:34.100 に答える
2

現在、属性を と比較していますsome_view。その値をその文字列と比較する必要があります。これを行うには、属性をキャストしstringて等値演算子を使用します。

var test = from _view in root.Descendants("view") where 
    ((string)_view.Attribute("name")) == "some_view" select _view;

これにより、ノードに属性がないNullReferenceException場合にコードがクラッシュしないことが保証されます。viewname

于 2013-09-09T11:51:46.370 に答える
1

あなたの問題は への呼び出しだと思いますXAttribute.EqualsEquals メソッドをオーバーライドできますが、そうすると誤解を招くような動作をXAttributeする参照型です。私はあなたが望むと思います。Attribute("name").Value.Equals("some_view")

ただし、それが唯一の問題であるとは限りません。現時点ではテストする立場にありません。

于 2013-09-09T11:50:44.433 に答える
0

あなたのコードは正しいです。アクセスするだけですattribute value

  XElement root = XElement.Load("params.xml");
   var test = from _view in root.Descendants("view") where 
              _view.Attribute("name").value.Equals("some_view") 
              select _view;
于 2013-09-09T16:12:34.267 に答える