进入另一个挑战。我查看了我在这里找到的一些问题,但我似乎无法拼凑出我需要的东西。
好的我有一个XML文件:
<Output id="1">
<path rename="Off" name="pattern-1">d:\temp</path>
</Output>
<Output id="2">
<path isRename="False" name="pattern-1" >d:\temp\out2</path>
<path isRename="True" name="pattern-1" >d:\temp\out3</path>
<path isRename="False" name="pattern-1">d:\temp\out4</path>
</Output>
我需要做的是根据<Output>
属性找到id
标记。然后我需要循环遍历所有<path>
标记并获取属性和路径值。我根据之前提出的一个问题尝试了一些事情,但我无法让它工作
var results = from c in rootElement.Elements("Output")
where (string)c.Attribute("Id") == "2" select c;
foreach (var path in rootElement.Elements("Output").Elements("path"))
{
string p = path.Value;
}
答案 0 :(得分:1)
如果您实际上没有使用结果,那么您的第一行不会执行任何操作。
foreach (var outputElement in rootElement.Elements("Output")
.Where(e => (string)e.Attribute("id") == "1"))
{
foreach (var pathElement in outputElement.Elements("path"))
{
// ...
}
}
如果您的id
属性保证是唯一的(它应该是),您可以摆脱第一个foreach并直接获取个人<Output>
:
var outputElement = rootElement.Elements("Output")
.FirstOrDefault(e => (string)e.Attribute("id") == "1"));
答案 1 :(得分:0)
我建议使用一些XPath来选择你需要的节点:
foreach (XElement path in root.XPathSelectElements("/Output/path[../@id=1]"))
{
string value = path.Value;
}
实际上,有时XPath允许您编写更易读且可管理的代码。您只需使用一些替换多个linq-to-xml语句的表达式。