查询级别0名称值

本文关键字:0名 查询 | 更新日期: 2023-09-27 18:27:46

如何在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

查询级别0名称值

使用XPath(请检查层次结构,没有缩进I可能是错误的):

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

如果Level不能在任何其他地方,这也适用:

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

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

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

一种方式可以是类似于这个

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

只要小心int.Parse(nameEL.PParent.Element("Level").Value)。它应该是一个int,或者你应该首先确定它是int,然后解析它

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