【问题标题】:Linq to xml how to get XElement by value in c#Linq to xml如何在c#中按值获取XElement
【发布时间】:2017-01-15 23:13:29
【问题描述】:

我有一个 xml:

<?xml version="1.0" encoding="utf-8"?>
<Fields>
  <Field>
    <Name>DEMOFIELD</Name>
    <Category>HardwareSoftwareRequirement</Category>
  </Field>
</Fields>

当我这样做时:

XElement xDoc = XElement.Load("File.xml");                
var x= xDoc.Descendants("Field").Where(elem => elem.Value == "DEMOFIELD");//returns no element

这没有返回任何东西。但是当我改为这样做时:

var x= xDoc.Descendants("Field").Where(elem => elem.Value.Contains( "DEMOFIELD"));//returns no element

在迭代时,它返回的是:DEMOFIELDHardwareSoftwareRequirement,而不是e.Value,它不能只是DEMOFIELD吗?

然后遍历获取值,

foreach(XElement e in x)
{
    _log.Debug(e.Value);//no value here
}

【问题讨论】:

    标签: c# xml linq linq-to-xml


    【解决方案1】:

    帖子中的代码按值获取节点,但它不是您要查找的节点。

    xDoc.Descendants("Field") 选择所有名为“Field”的节点,但该节点只有子节点。因此,当您在该节点上调用 .Value 时,该值是通过串联所有子值(“DEMOFIELD”+“HardwareSoftwareRequirement”=“DEMOFIELDHardwareSoftwareRequirement”)来计算的。

    根据您实际查找的内容,您需要选择所有“名称”节点并按值过滤或检查名为“名称”的子节点的值:

      var nameByValue = xDoc.Descendants("Name")
            .Where(elem => elem.Value == "DEMOFIELD");
      var fieldByChildValue = xDoc.Descendants("Field")
            .Where(elem => elem.Element("Name").Value == "DEMOFIELD");
    

    【讨论】:

    • 谢谢@Alexei ...这是我真正错过的:-按名称而不是字段选择
    【解决方案2】:

    您需要确保比较正确元素的值,嵌套 XML 很容易出错。在您的情况下,您正在比较 Field 元素的值(这将是连接的所有内部值),但您的意思是将其与 Name 元素进行比较。

    试试这个:

    var xml = @"<?xml version=""1.0"" encoding=""utf-8""?>
    <Fields>
      <Field>
        <Name>DEMOFIELD</Name>
        <Category>HardwareSoftwareRequirement</Category>
      </Field>
    </Fields>";
    var xdoc = XDocument.Load(new StringReader(xml));
    var x = xdoc.Descendants("Field").Where(elem => elem.Element("Name")?.Value == "DEMOFIELD");
    

    您现在仍然拥有Field 元素,因此如果您想获得类别,您需要执行以下操作:

    x.First().Element("Category").Value
    

    【讨论】:

    • 运行您的解决方案仍然会出现同样的问题。当你遍历 x,并打印出迭代变量的值时,它仍然是:DEMOFIELDHardwareSoftwareRequirement 而不仅仅是 DEMOFIELD
    • 是的,因为我们有 Field 元素,这就是您要打印的值。您现在需要从中选择您关心的部分。
    • 类似x.First().Element("Category").Value
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多