根据主节点的属性值选择所有后代/子节点。

时间:2016-08-10 16:36:30

标签: c#

我正在尝试根据属性值提取xml块。 这是我的xml看起来像

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<HelperKey>
 <HardwareType Module="1234">
  <m2MainHelperKey>F1DF15D4D1F5D3</m2MainHelperKey>
  <m2LowerHelperKey>ER66T4T4R5T4R</m2LowerHelperKey>
  <m2UpperHelperKey>4VXC4V5C54VC5</m2UpperHelperKey>
 </HardwareType>
 <HardwareType Module="AB45">
  <m2MainHelperKey>F1DF15FGFD4D1F5D3</m2MainHelperKey>
  <m2LowerHelperKey>ERTRTRR66T4T4R5T4R</m2LowerHelperKey>
  <m2UpperHelperKey>4VXC4FDFDFDV5C54VC5</m2UpperHelperKey>
 </HardwareType>
</HelperKey>

如何根据模块值选择HardwareType中的所有节点,例如如果用户提供了需要选择的模块1234

<HardwareType Module="1234">
 <m2MainHelperKey>F1DF15D4D1F5D3</m2MainHelperKey>
 <m2LowerHelperKey>ER66T4T4R5T4R</m2LowerHelperKey>
 <m2UpperHelperKey>4VXC4V5C54VC5</m2UpperHelperKey>
</HardwareType>

以下是一些示例代码

private void button1_Click(object sender, EventArgs e) {

        string helpKey = HelpKey("1234", "m2LowerHelperKey");
}

string HelpKey(string module, string helperKeyName) {

        var xmlLoadfullPath = @"C:\_Codebase\Hardware\test.xml";
        var doc = XDocument.Load(xmlLoadfullPath);
        var dataid = doc.Descendants("HelperKey").Elements();

        //Write code below to select, If user passes "1234" select 

        //<HardwareType Module="1234">
        //<m2MainHelperKey>F1DF15D4D1F5D3</m2MainHelperKey>
        //<m2LowerHelperKey>ER66T4T4R5T4R</m2LowerHelperKey>
        //<m2UpperHelperKey>4VXC4V5C54VC5</m2UpperHelperKey>
        //</HardwareType>

        //Write code below to get specfic key value based on user input e.g. helperKeyName = "m2LowerHelperKey"
        //return this value -> ER66T4T4R5T4R

        var helpKey = "";

        return helpKey;
    }

3 个答案:

答案 0 :(得分:0)

您可以使用linq:

var hardware1234 = doc.Elements("HardwareType").
    Where(attribute => attribute.Name.LocalName.Equals("Module") 
    && attribute.Value != null && attribute.Value.Equals("1234"));

简而言之,这说:

“给我所有名为Hardware的元素,他们有一个名为Module的属性,其非null值为1234。”

答案 1 :(得分:0)

如果您只想选择模块= 1234的HardwareType元素,可以尝试:

doc.Root.Elements("HardwareType").Where(e => e.Attribute("Module").ToString() == "1234");

答案 2 :(得分:0)

  XDocument doc = XDocument.Load(@"xmlfile1.xml");
        //get all elements for certain attribute
        var q = doc.Descendants("HardwareType").Where(c => (string) c.Attribute("Module") == "1234");

        foreach (var x in q.Elements())            
            Console.WriteLine("Name: {0}    value: {1}",x.Name , x.Value);  

        //get one element by name
        var el = q.Elements("m2LowerHelperKey").FirstOrDefault().Value;
        Console.WriteLine(el);

Try It

结果:

    Name: m2MainHelperKey    value: F1DF15D4D1F5D3
    Name: m2LowerHelperKey    value: ER66T4T4R5T4R
    Name: m2UpperHelperKey    value: 4VXC4V5C54VC5
    ER66T4T4R5T4R