【问题标题】:Get the value of the child nodes in a xml with unknown depth获取深度未知的xml中子节点的值
【发布时间】:2012-05-07 15:43:27
【问题描述】:

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

我想要这份清单:

  • url1
  • url4
  • url5
  • url6

在 XML 示例中 我没有得到 url "url2" 因为他的节点 "t" = 0 我没有得到网址“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();

【问题讨论】:

  • 这仍然是一个问题还是您找到了解决方案?

标签: linq linq-to-xml


【解决方案1】:

我不太确定为什么在预期结果中您希望看到 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 缺失,因为没有祖先元素有 t 子元素

【讨论】:

    【解决方案2】:

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

    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

    【讨论】:

    • 如果这是答案,那么您应该考虑将其标记为已接受,以便其他 SO 用户可以更轻松地找到它。查看您尚未将任何答案标记为已接受的问题历史记录,有必要查看最新的答案以查看其中是否有人回答您的问题并将其标记为已接受。
    猜你喜欢
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2013-06-20
    相关资源
    最近更新 更多