从子节点查询xml父节点属性

时间:2013-05-31 05:23:09

标签: c# xml linq excel interop

我正在使用类似于此的xml:

<?xml version="1.0" encoding="utf-8"?>
<Results>
  <Pattern Name="Substitution">
    <TestList>
      <Test>
        <Inputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Inputs>
        <Outputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Outputs>
      </Test>
      <Test>
        <Inputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Inputs>
        <Outputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Outputs>
      </Test>
    </TestList>
  </Pattern>
  <Pattern Name="MinMax">
    <TestList>
      <Test>
        <Inputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Inputs>
        <Outputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Outputs>
      </Test>
      <Test>
        <Inputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Inputs>
        <Outputs>
          <Variable Name="A" Value="-1" />
          <Variable Name="B" Value="20" />
        </Outputs>
      </Test>
    </TestList>
  </Pattern>
</Results>

我正在使用linq和excel interop将测试中的值写入Excel工作表。

var tests = from test in document.Descendants("Test").Descendants("Inputs")
            select new
            {
                inputNames = test.Elements("Variable").Attributes("Name")
            };

foreach (var test in tests)
{
    valueRow = valueMatch.Row;

    foreach (var inputName in test.inputNames)
    {
        if (valueSection.Find(inputName.Value, Missing.Value, Missing.Value, XlLookAt.xlWhole) != null)
        {
             workSheetTwo.Cells[valueRow, valueColumn] = inputName.NextAttribute.Value;                       
             ++valueRow;
        }
    }

    ++valueColumn;
}

将值写入Excel工作表工作正常,但我还需要根据它所处的模式名称编写具有不同单元格背景颜色的值..(例如,如果模式名称=“替换”,则为蓝色,如果为Pattern Name =“MinMax”)。是否可以从“inputName”获取模式名称的值?我尝试使用inputName.Parent.Element("Pattern").Attribute("Name").Value ..但是这会返回一个异常。这样做的正确方法是什么?任何帮助,将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:1)

你很接近,而不是Element("Pattern")这样打电话Ancestors("Pattern").First() ......

inputName.Parent.Ancestors("Pattern").First().Attribute("Name").Value

答案 1 :(得分:0)

var tests = from p in xdoc.Descendants("Pattern")
            from input in p.Descendants("Test").Elements("Inputs")
            select new {
                Pattern = p.Attribute("Name").Value,
                Variables = input.Elements("Variable").Attributes("Name") };