0

次のような XML を取得します。

<menu>
  <is>
    <not>
      <l>Title</l>
      <s>url1</s>
      <t>1</t>
      <is>
        <hlua>
          <l>Title</l>
          <s>url2</s>
          <t>0</t>
            <is>
              <frme>
                <l>Title</l>
                <s>url3</s>
                <t>1</t>
              </frme>
            </is>
        </hlua>
        <chrj>
          <l>Title</l>
          <s>url4</s>
          <t>1</t>
            <is>
              <cgas>
                <l>Title</l>
                <s>url5</s>
                <t>1</t>
                <is>
                  <el12>
                    <l>Title</l>
                    <s>url6</s>
                    <t>1</t>
                  </el12>
                </is>
              </cgas>
              <cael>
                <l>Title</l>
                <s>url7</s>
                <t>0</t>
              </cael>
            </is>
        </chrj>
      </is>
    </not>
  </is>
<menu>

子ノードの名前はわかりません。ノード「メニュー」の名前だけです。値ノードのリストを取得したいと思います:ノード「t」= 1の場合は「s」、親ノード「t」= 1の場合は「s」

このリストを取得したい:

  • url1
  • url4
  • url5
  • url6

XML の例では、彼のノード "t" = 0 であるため、URL "url2" を取得できません。彼のノード "t" = 1 にもかかわらず、彼の親ノード "hlua" には彼のノード "t" = 0

LINQでこれを行うにはどうすればよいですか?

ありがとう!

これで私の質問は解決すると思います:

List<XElement> listurls = (from elements in xe.Descendants()
    //Elemento
    let t_element = elements.Element("t")
    let t_element_value = t_element != null ? t_element.Value : String.Empty

    //Elemento Padre
    let parent_element = elements.Parent.Parent
    let t_element_parent = parent_element.Element("t")
    let t_element_parent_value = t_element_parent != null ? t_element_parent.Value : "1"

    where t_element_value.EndsWith("1") && t_element_parent_value.EndsWith("1") && elements.Element("u").Value!="#" && elements.Element("u").Value != "" 
    select elements.Element("u")).ToList();
4

2 に答える 2

0

期待される結果にurl1が表示される理由はよくわかりません。値が「1」に等しい子t要素を持つ祖先要素はありません。とにかく、私はあなたが見てみたいと思うかもしれない次のクエリを思いつきます:

var xDoc = XDocument.Parse(
@"<menu>
  <is>
    <not>
      <l>Title</l>
      <s>url1</s>
      <t>1</t>
      <is>
        <hlua>
          <l>Title</l>
          <s>url2</s>
          <t>0</t>
            <is>
              <frme>
                <l>Title</l>
                <s>url3</s>
                <t>1</t>
              </frme>
            </is>
        </hlua>
        <chrj>
          <l>Title</l>
          <s>url4</s>
          <t>1</t>
            <is>
              <cgas>
                <l>Title</l>
                <s>url5</s>
                <t>1</t>
                <is>
                  <el12>
                    <l>Title</l>
                    <s>url6</s>
                    <t>1</t>
                  </el12>
                </is>
              </cgas>
              <cael>
                <l>Title</l>
                <s>url7</s>
                <t>0</t>
              </cael>
            </is>
        </chrj>
      </is>
    </not>
  </is>
</menu>");

var urls = from url in xDoc.Descendants("s")
            let ancestorWithTChildElement = url.Parent.Ancestors().FirstOrDefault(e => e.Elements("t").Any())
            where (string)url.Parent.Element("t") == "1"
            && ancestorWithTChildElement != null && (string)ancestorWithTChildElement.Element("t") == "1"
            select url;

foreach (var urlElement in urls)
{
    Console.WriteLine((string)urlElement);
}

結果は次のようになります。

url4
url5
url6
何かキーを押すと続行します 。。。

(子要素を持つ祖先要素がまったくないため、url1がありません

于 2012-05-07T20:49:28.313 に答える
0

わかった!!!解決:

List<string> listurls = (from a in xe.Descendants("s")
   let ancestros = a.Ancestors().Elements("t").FirstOrDefault(e => e.Value.EndsWith("0"))
   where ancestros == null
   select a.Value).ToList();

=D

于 2012-05-09T20:49:57.043 に答える