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

时间:2016-07-05 15:26:31

标签: c# xml linq linq-to-xml

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

所以我有一个像这样结构的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 / name / registered,以及类似的东西? 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将是我实现我想要做的最好的选择。

3 个答案:

答案 0 :(得分:1)

这些关键值称为属性,这里有几种不同的方法来访问它们:

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;添加到文件顶部,这样您就不需要在每次调试之前添加它。

答案 1 :(得分:0)

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

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

 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());
  }

答案 2 :(得分:0)

请原谅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