Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq 获取深度未知的xml中子节点的值_Linq_Linq To Xml - Fatal编程技术网

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

Linq 获取深度未知的xml中子节点的值,linq,linq-to-xml,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>

我得到的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>
我不知道子节点的名称,只知道节点菜单的名称。 我想得到一个值列表节点:s,如果他们的节点t=1,如果他的父节点t=1

我想得到以下列表:

url1 url4 url5 url6 在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();

我不太清楚为什么在预期的结果中会看到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 Press any key to continue . . . url1丢失了,因为根本没有一个祖先元素有一个t子元素

我明白了!!! 解决方案:

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

这仍然是一个问题,还是你找到了解决方案?如果这是答案,那么你应该考虑将它标记为接受,以便其他用户可以更容易地找到它。查看您的问题历史记录,您尚未将任何答案标记为已接受,因此有必要查看最新的答案,看看是否有任何答案已回答您的问题,并将其标记为已接受。