查询级别0名称值

时间:2014-10-23 15:29:54

标签: c# linq

如何在0的第一个之前找到name的值。 所以答案是XXXXXX?

<?xml version="1.0" encoding="utf-8" ?> 
- <mes_message>
  <msg_environment>UUUUU</msg_environment> 
- <msg_header>
  <msg_type>VscLineageResponse</msg_type> 
  <msg_stat>1</msg_stat> 
  <msg_source>M590</msg_source> 
  <msg_time>2014/10/23 09:37:44</msg_time> 
  <msg_description /> 
  <msg_string>Inquiry completed successfully</msg_string> 
  </msg_header>
- <msg_body>
- <ChildContainer>
  <Name>MEDMESC-CLN0001</Name> 
  <Level>1</Level> 
  </ChildContainer>
- <ChildContainer>
  <Name>Bay2-CLN0001</Name> 
  <Level>1</Level> 
  </ChildContainer>
- <ChildContainer>
  <Name>XXXXXX</Name> 
  <Level>0</Level> 
  </ChildContainer>
- <ChildContainer>
  <Name>Bay2-CLN0001</Name> 
  <Level>1</Level> 
  </ChildContainer>
  </msg_body>
  </mes_message

4 个答案:

答案 0 :(得分:2)

使用XPath(请检查层次结构,没有缩进我可能错了):

mes_message/msg_body/ChildContainer/Level[contains(., '0')]

如果Level不能出现在任何其他地方,那么这也有效:

//Level[contains(., '0')]

然后,您可以使用preceding-sibling获取上一个兄弟节点的值。在LINQ to XML中,您可以使用XPathSelectElements("preceding-sibling::*")或仅使用ElementsBeforeSelf()

答案 1 :(得分:1)

foreach (var el in xml.Descendants("ChildContainer").Where(el => el.Element("Level").Value == "0"))
{
    string value = (string)el.Element("Name");
    ....
}

答案 2 :(得分:1)

单向可能是这样的

var el = xdoc.Descendants("Name").
                FirstOrDefault(nameEL => nameEL.Parent.Name == "ChildContainer" && int.Parse(nameEL.Parent.Element("Level").Value) == 0);

注意int.Parse(nameEL.Parent.Element(&#34; Level&#34;)。值)。它应该是一个int或你应该首先确定它是int然后解析它

答案 3 :(得分:1)

var result = xml.Descendants("ChildContainer")
                .Where(x => x.Descendants("Level").First().Value == "0")
                .Descendants("Name");
相关问题