获取具有未知深度的xml中的子节点的值

时间:2012-05-07 15:43:27

标签: linq linq-to-xml

我得到这样的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>

我不知道子节点的名称,只知道节点“menu”的名称。 我想得到一个值节点列表:“s”如果他们的节点“t”= 1并且他的父节点“t”= 1

我想得到这个清单:

  • url1
  • URL4
  • URL5
  • url6

在XML示例中 我没有得到网址“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();

2 个答案:

答案 0 :(得分: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);
}

结果是:

url4
url5
url6
Press any key to continue . . .

(url1缺失,因为没有祖先元素根本没有t子元素

答案 1 :(得分: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