我正在开发 asp.net 移动应用程序。我使用 XML 作为数据库。我正在 .net 中使用 LINQ to XML 查询 XML 以访问所需的元素和属性。我的 XML 文件中有以下部分。
<VALVES>
<VALVE NAME="PWV">
<DISPLAY-NAME>
Production Master Valve
</DISPLAY-NAME>
<COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
</VALVE>
<VALVE NAME="PMV" >
<DISPLAY-NAME>
Production Wing Valve
</DISPLAY-NAME>
<COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
</VALVE>
</VALVES>
在上面的 XML 文件中,我可以使用以下代码动态访问子元素节点“VALVE”及其属性“NAME”,而无需显式指定属性名称。因此,当在子节点“VALVE”中添加任何新属性时,我可以访问它而无需修改现有代码。对于这样的逻辑,我使用以下代码。在下面的代码中,ValvesProperties 是在“Vallves”类中定义的哈希表。
static int count = 0;
List<Valves> LstValves = new List<Valves>();
string AttName = null;
string AttValue = null;
XDocument FieldDef = XDocument.Load(@"F:\Shailesh from user OPC\XML\KK3.xml");
XElement FieldRoot = FieldDef.Element("KK");
count = FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements("VALVE").Count();
Valves[] Valveobj = new Valves[count];
count = 0;
foreach (var element in FieldRoot.Element("FIELD-DEFINITION").Element("VALVES").Elements())
{
Valveobj[count] = new Valves();
foreach (var attribute in element.Attributes())
{
AttName = attribute.Name.ToString();
AttValue = attribute.Value.ToString();
Valveobj[count].ValvesProperties.Add(AttName, AttValue);
LstValves.Add(Valveobj[count]);
}
count++;
}
return LstValves;
上面定义的 XML 部分需要类似的逻辑。在上面的 XML 中,我想编写 LINQ to XML 查询,该查询可以访问“VALVE”节点的 NAME 属性(<VALVE NAME="PWV">
),那么它应该访问“DISPLAY-NODE”之间的文本(<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>
),然后它应该动态访问“COMMAND”节点的所有属性(<COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>
)。所有这些我都想要动态地进行,而无需显式指定子节点的名称及其属性的名称(类似于我编写上述查询的方式)我们可以使用 LINQ to XML 编写这样的代码吗?如果我们可以用单个逻辑编写上述问题的代码(类似于我编写上述查询的方式),那就更好了。您能给我提供可以解决上述问题的任何代码或链接吗?
您可以迭代所有元素并检索每个元素的属性:
var allDescendants = myElement.DescendantsAndSelf();
var allDescendantsWithAttributes = allDescendants.SelectMany(elem =>
new[] { elem }.Concat(elem.Attributes().Cast<XContainer>()));
foreach (XContainer elementOrAttribute in allDescendantsWithAttributes)
{
// ...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)