如何查询特定父元素的子元素

时间:2010-08-16 15:01:16

标签: c# asp.net linq-to-xml

我正在开发asp.net移动应用程序。我使用XML作为数据库。我使用XML文件的以下部分来使用LINQ to XML查询数据。

<USER-INTERFACE-DEFINITION>
      <MIMICS>
       <MIMIC ID="1" NAME="Home">
        <SECTIONS>
         <SECTION ID ="1" NAME="System Health" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="2" NAME="Network Status" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="3" NAME="ESD Status" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="4" NAME="DWPLEM" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID="5" NAME="Manifolds" CONTROL-TYPE="Drowpdown">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="6" NAME="Wells" CONTROL-TYPE="Drowpdown">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="7" NAME="Alarms" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
         <SECTION ID ="8" NAME="House Keeping" CONTROL-TYPE="Button">
          <DATAITEMS>
          </DATAITEMS>
         </SECTION>
        </SECTIONS>
       </MIMIC>
    </USER-INTERFACE-DEFINITION>

在上面的XML文件中,我想用条件MIMIC ID =“1”来检索SECTION节点的“NAME”属性。我不想修改我现有的XML文件。我有一个带有simialr元素的节点的服务器集合作为上面的XML文件。能否请您提供我可以解决上述问题的任何代码或链接?

4 个答案:

答案 0 :(得分:3)

var xml = XElement.Parse("your xml");
var q = from m in xml.Descendants("MIMIC")
        where (int)m.Attribute("ID") == 1
        from s in m.Descendants("SECTION")
        select (string)s.Attribute("NAME");

foreach ( var name in q ) {
    Console.WriteLine(name);
}

我在LINQPad中对上面的内容进行了测试,确实产生了:

    System Health
    Network Status
    ESD Status
    DWPLEM
    Manifolds
    Wells
    Alarms
    House Keeping

答案 1 :(得分:0)

也许类似于(不是LINQ,但如果你愿意,可以将它与LINQ一起使用):

var nodes = myXmlDoc.SelectNodes("/USER-INTERFACE-DEFINITION/MIMICS/MIMIC[@ID='1']/SECTION/@NAME");
foreach(var node in nodes)
{
    string name = node.Value;
    // do something with each name
}

(假设myXmlDoc是使用.Load(yourXmlFileHer)创建的,并假设USER-INTERFACE-DEFINITION是XML的根,否则,请以//代替

答案 2 :(得分:0)

我会尽力尝试,但您可能不会提供相关的XML部分,以便我们更轻松。该部分是否具有此条件或名称。至少我可能会让你开始。

让我们从这开始:

var name = xml.Descendants<SECTION>.Where(s => s.id == 1).GetFirstChild<NAME>();

希望我不会离开,如果是这样的话,我想有人会提供更好的答案。

看到你的XML之后我还不错。此外,当我想到它后裔可能不会工作。

答案 3 :(得分:0)

假设您的XML保存在名为xml的字符串中,那么:

var root = XElement.Parse(xml);
var results = root
            .Descendants("MIMIC")
            .Where( e => e.Attribute("ID").Value == "1" )
            .SelectMany(e => e.Descendants("SECTION").Attributes("NAME" ) ) ;