不确定如何使用 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 将是实现我尝试执行的操作的最佳选择。
这些键值称为属性,以下是访问它们的几种不同方法:
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