*我对此完全陌生,这是我正在做的个人项目。 *
所以我有一个像这样结构的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将是我实现我想要做的最好的选择。
答案 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