Linq to xml 如何在 C# 中按值获取 XElement
Linq to xml how to get XElement by value in c#
我有一个 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
在迭代中,不是 e.Value
,而是 returns: DEMOFIELDHardwareSoftwareRequirement
,不能只是 DEMOFIELD
吗?
然后遍历得到值,
foreach(XElement e in x)
{
_log.Debug(e.Value);//no value here
}
您需要确保比较的是正确元素的值,嵌套 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
post中的代码按值获取节点,但不是您要查找的节点。
xDoc.Descendants("Field")
selects 所有名为 "Field" 的节点,但该节点只有子节点。因此,当您在该节点上调用 .Value
时,该值是通过连接所有子节点的值来计算的 ("DEMOFIELD" + "HardwareSoftwareRequirement" = "DEMOFIELDHardwareSoftwareRequirement").
根据您实际查找的内容,您需要 select 所有 "Name" 节点并按值过滤或检查名为 "Name":
的子节点的值
var nameByValue = xDoc.Descendants("Name")
.Where(elem => elem.Value == "DEMOFIELD");
var fieldByChildValue = xDoc.Descendants("Field")
.Where(elem => elem.Element("Name").Value == "DEMOFIELD");
我有一个 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
在迭代中,不是 e.Value
,而是 returns: DEMOFIELDHardwareSoftwareRequirement
,不能只是 DEMOFIELD
吗?
然后遍历得到值,
foreach(XElement e in x)
{
_log.Debug(e.Value);//no value here
}
您需要确保比较的是正确元素的值,嵌套 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
post中的代码按值获取节点,但不是您要查找的节点。
xDoc.Descendants("Field")
selects 所有名为 "Field" 的节点,但该节点只有子节点。因此,当您在该节点上调用 .Value
时,该值是通过连接所有子节点的值来计算的 ("DEMOFIELD" + "HardwareSoftwareRequirement" = "DEMOFIELDHardwareSoftwareRequirement").
根据您实际查找的内容,您需要 select 所有 "Name" 节点并按值过滤或检查名为 "Name":
的子节点的值 var nameByValue = xDoc.Descendants("Name")
.Where(elem => elem.Value == "DEMOFIELD");
var fieldByChildValue = xDoc.Descendants("Field")
.Where(elem => elem.Element("Name").Value == "DEMOFIELD");