不确定如何使用 LINQ 访问此特定元素

本文关键字:元素 访问 何使用 LINQ 不确定 | 更新日期: 2023-09-27 17:55:11

* 我对此完全陌生,这是我正在做的一个个人项目。

所以我有一个这样的XML文档

<Licensing key="20325">
  <Organization Org="500">
    <Constraints>
      <MaximumOrgsInSecurity>2</MaximumOrgsInSecurity>
      <MaximumUsersInSecurity>999</MaximumUsersInSecurity>
      <MaximumLoggedInUsers>999</MaximumLoggedInUsers>
      <MaximumLenders>1</MaximumLenders>
      <OptOutofPasswordPolicy>FALSE</OptOutofPasswordPolicy>
    </Constraints>
    <Modules>
      <Module registered="true" name="DV" id="1" />
      <Module registered="true" name="DP" id="2" />
      <Module registered="true" name="DCC" id="3" />
      <Module registered="false" name="DRE" id="4" />
    </Modules>
  </Organization>
</Licensing>

我正在尝试在我的 C# 代码中使用 LINQ 读取它,尽管我正在尝试在 LINQ (http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples) 上遵循本教程,但我似乎无法访问我想要的元素。例如,我将如何使用 LINQ 获取密钥编号 20325、组织编号 500、每个模块的 ID/名称/注册等?XML 文档必须采用此格式。任何帮助或演练将不胜感激,谢谢!

编辑: 例如,我试过做

  IEnumerable<XElement> Licensing = xelement.Elements();
  foreach (var Organization in Licensing)
  {
      System.Diagnostics.Debug.Write(Organization.Element("Constraints").Value);
  }

看看这会给我什么,它给了 29999991FALSE,当时我希望它会给出类似

 MaximumOrgsInSecurity
 MaximumUsersInSecurity
 MaximumLoggedInUsers
 MaximumLenders
 OptOutofPasswordPolicy

或至少

 2
 999
 999
 1
 False

我也试过做

  IEnumerable<XElement> Licensing = xelement.Elements();
  foreach (var Organization in Licensing)
  {
      System.Diagnostics.Debug.Write(Organization.Element("Modules").Value);
  }

看看这会给什么,它绝对什么也没给。

如果有比 LINQ 更好的方法来做到这一点,那么我就是全神贯注的。我说 LINQ 的唯一原因是,根据我到目前为止的发现,LINQ 将是实现我尝试执行的操作的最佳选择。

不确定如何使用 LINQ 访问此特定元素

这些键值称为属性,以下是访问它们的几种不同方法:

Debug.WriteLine(xelement.Attribute("key").Value);
Debug.WriteLine(xelement.Element("Organization").Attribute("Org").Value);
Debug.WriteLine(((XElement)xelement.FirstNode).Attribute("Org").Value);

对于要选择高级别的约束,需要选择具有.Elements()的子节点:

foreach (var constraint in xelement.Descendants("Constraints").Elements())
{
    Debug.WriteLine(constraint.Name + ": " + constraint.Value);
}
foreach (var constraint in xelement.Element("Organization").Element("Constraints").Elements())
{
    Debug.WriteLine(constraint.Name + ": " + constraint.Value);
} 

您还可以将using System.Diagnostics;添加到文件顶部,这样就不需要在每次调试之前添加它。

因此,根据@mattmanser所说的,并进一步研究 LINQ 和 Xelement/Xdocument,我想出了如何做我想做的事情。

例如,假设我想知道模块元素中的所有"注册"布尔值并将它们存储在布尔数组中,Id 这样做:

 string Name = FileUpload1.FileName;
 bool[] ModuleBools = new bool[4];
 for (int moduleID = 1; moduleID < 5; moduleID++)
 {
     var quotes = XDocument.Load("C:/Users/.../Created XMLs/" + Name)
                                      .Descendants("Module")
                                      .Where(x => (string)x.Attribute("id") == moduleID.ToString())
                                      .Select(x => (string)x.Attribute("registered"))
                                      .ToList();
     ModuleBools[moduleID-1] = bool.Parse(quotes.First());
  }

请原谅VB。 通过给定的示例,以下是访问每个项目的方式。 变量名称虽然与元素相同,但只是名称。

    Dim someXE As XElement
    ' someXE = XElement.Load("path here") 'to load from file / uri
    ' for testing we can do this
    someXE = <Licensing key="20325">
                 <Organization Org="500">
                     <Constraints>
                         <MaximumOrgsInSecurity>2</MaximumOrgsInSecurity>
                         <MaximumUsersInSecurity>999</MaximumUsersInSecurity>
                         <MaximumLoggedInUsers>999</MaximumLoggedInUsers>
                         <MaximumLenders>1</MaximumLenders>
                         <OptOutofPasswordPolicy>FALSE</OptOutofPasswordPolicy>
                     </Constraints>
                     <Modules>
                         <Module registered="true" name="DV" id="1"/>
                         <Module registered="true" name="DP" id="2"/>
                         <Module registered="true" name="DCC" id="3"/>
                         <Module registered="false" name="DRE" id="4"/>
                     </Modules>
                 </Organization>
             </Licensing>
    Dim key As String = someXE.@key
    Dim MaximumOrgsInSecurity As String = someXE.<Organization>.<Constraints>.<MaximumOrgsInSecurity>.Value
    Dim MaximumUsersInSecurity As String = someXE.<Organization>.<Constraints>.<MaximumOrgsInSecurity>.Value
    Dim MaximumLoggedInUsers As String = someXE.<Organization>.<Constraints>.<MaximumLoggedInUsers>.Value
    Dim MaximumLenders As String = someXE.<Organization>.<Constraints>.<MaximumLenders>.Value
    Dim OptOutofPasswordPolicy As String = someXE.<Organization>.<Constraints>.<OptOutofPasswordPolicy>.Value