我正在开发asp.net移动应用程序。我使用XML作为数据库。我正在查询XML以访问所需的元素和&在.net中使用LINQ to 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'&amp;它的属性'NAME'是动态的,不使用以下代码显式指定属性的名称。 因此,当在子节点“VALVE”中添加任何新属性时,我可以在不修改现有代码的情况下访问它。对于这样的逻辑,我使用以下代码。在下面的代码中,ValvesProperties是Hashtable,它在“Valves”类中定义。
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中,我想编写可以访问'VALVE'节点(<VALVE NAME="PWV">
)的NAME属性的LINQ to XML查询,然后它应该访问'DISPLAY-NODE'之间的文本({{1} }),&amp;那么它应该动态地访问'COMMAND'节点的所有属性(<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>
)。所有这些我想动态而不明确指定子节点的名称以及它们的属性名称(类似于我编写上述查询的方式)我们可以使用LINQ to XML编写这样的代码吗?如果我们可以在单个逻辑中编写上述问题的代码会更好(类似于我编写上述查询的方式)。您能否提供我可以解决上述问题的任何代码或链接?
答案 0 :(得分:0)
您可以遍历所有元素并检索每个元素的属性:
var allDescendants = myElement.DescendantsAndSelf();
var allDescendantsWithAttributes = allDescendants.SelectMany(elem =>
new[] { elem }.Concat(elem.Attributes().Cast<XContainer>()));
foreach (XContainer elementOrAttribute in allDescendantsWithAttributes)
{
// ...
}