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并且他的父节点“t”= 1,则为“s”

我想得到这个列表:

  • 网址1
  • 网址4
  • 网址5
  • 网址6

在 XML 示例中,我没有得到 url “url2”,因为他的节点“t” = 0 我没有得到 url “url3”,因为虽然他的节点“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

我得到它!!!解决方案:

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 回答
0

我不太确定为什么在预期结果中您希望看到 url1 - 没有祖先元素的子 t 元素的值等于“1”。无论如何,我想出了以下查询,您可能想看看:

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);
}

结果是:

网址4
网址5
网址6
按任意键继续 。. .

(缺少 url1,因为根本没有子元素具有的祖先元素

于 2012-05-07T20:49:28.313 回答