【问题标题】:How to query the child elements of a particular parent element如何查询特定父元素的子元素
【发布时间】:2010-08-16 15:01:15
【问题描述】:

我正在开发 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 文件。我有与上述 XML 文件类似的节点的服务器集合。您能否提供我可以解决上述问题的任何代码或链接?

【问题讨论】:

  • 在 ID=1 的 MIMIC 节点下有 lots 个 SECTION 节点。你追求的是哪一个?
  • @Jon:谢谢,我更改了答案以反映这一点:)
  • 我想检索条件 MIMIC ID=1 的所有 SECTION 节点的“NAME”、“ID”和 CONTROL-TYPE”属性
  • 这是一个新请求,不同于“我想检索“NAME”属性...”。乔恩的意思,有很多节点满足你的条件,你确定是对的吗?
  • 是的,这意味着有很多节点满足给定条件

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


【解决方案1】:
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 中测试了上述内容,它确实产生了:

系统健康 网络状态 ESD 状态 DWPLEM 歧管 威尔斯 警报 看家

【讨论】:

  • 我实际上讨厌 LINQ to XML,因为等效的 XPath 几乎总是更干净。但由于 OP 要求使用 LINQ to XML,我想我会遵守的。 :)
  • 感谢您的解决方案。如果你能告诉我如何一次检索所有元素 - ID ="1" NAME="System Health" CONTROL-TYPE="Button" 那么它会对我有很大帮助。
  • 而不是 select (string)s.Attribute("NAME") 只需将其更改为 select s。这将为您提供整个 SECTION 节点。
【解决方案2】:

可能类似于(不是 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 的根,否则,请改用 // 开头)

【讨论】:

    【解决方案3】:

    假设您的 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" ) ) ;
    

    【讨论】:

      【解决方案4】:

      我会尽力而为,但您可能不想提供 XML 的相关部分以使我们更容易。该部分是否具有此条件或名称。至少我可以让你开始。

      让我们从这个开始:

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

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

      好吧,在看到你的 XML 之后,我有点离题了。另外,当我想到它时,后代可能不会工作。

      【讨论】:

      • 您正在尝试使用名称作为泛型类型参数...您的意思是 Descendants("SECTION") 等。
      • 是的,只是注意到在我的编辑中,在我回答之前也没有看到 XML,所以这还有一段路要走。
      猜你喜欢
      • 2018-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 1970-01-01
      • 1970-01-01
      • 2018-07-09
      • 2021-09-07
      相关资源
      最近更新 更多