2010-08-14 69 views
1

我正在开发asp.net移动应用程序。我使用XML作为数据库。我正在查询XML以通过在.net中使用LINQ to XML访问所需的元素&属性。我的XML文件中有以下部分。如何编写单个LINQ to 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文件I能够访问的子元素节点“VALVE” &其属性“NAME”动态而不通过使用下面的代码显式指定属性的名称。 因此,任何新的属性被添加到子节点'VALVE'中,我可以在不修改现有代码的情况下访问它。对于这样的逻辑我使用下面的代码。在以下代码中,ValvesProperties是在“阀门”类中定义的Hashtable。

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'节点的名称属性(<VALVE NAME="PWV">),那么它应该访问'DISPLAY-NODE'(<DISPLAY-NAME> Production Master Valve </DISPLAY-NAME>),&之间的文本,然后它应该访问“命令”节点的所有属性都是动态的(<COMMANDS USE-TEMPLATE="TRUE" TEAMPLATE-NAME="ValveCommands.xml"></COMMANDS>)。所有这些我都需要动态地显式指定子节点的名称以及它们的属性名称(类似于我编写上述查询的方式)我们可以使用LINQ to XML编写这样的代码吗?如果我们可以在单个逻辑中编写上述问题的代码(类似于我编写上述查询的方式),会更好。你能否提供我可以解决上述问题的任何代码或链接?

+0

如果您发布的代码或XML,** **请在高亮文本编辑器的线,然后点击“代码“编辑器工具栏上的按钮(101 010)可以很好地格式化和语法突出显示它! – 2010-08-14 08:21:33

回答

0

你可以通过所有的元素只是想迭代和检索每个属性:

var allDescendants = myElement.DescendantsAndSelf(); 
var allDescendantsWithAttributes = allDescendants.SelectMany(elem => 
    new[] { elem }.Concat(elem.Attributes().Cast<XContainer>())); 

foreach (XContainer elementOrAttribute in allDescendantsWithAttributes) 
{ 
    // ... 
}