根据主节点的属性值选择所有死者/子节点

本文关键字:死者 子节点 选择 节点 属性 | 更新日期: 2023-09-27 18:01:40

我正在尝试基于属性值提取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>

我如何根据模块值选择硬件类型中的所有节点,例如,如果用户提供模块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;
    }

根据主节点的属性值选择所有死者/子节点

您可以使用linq进行以下操作:

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

简而言之,这说明:

"给我所有元素命名硬件,其中它们有一个非空值为1234的属性命名模块。">

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

doc.Root.Elements("HardwareType").Where(e => e.Attribute("Module").ToString() == "1234");
  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);

试试

结果:

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