【问题标题】:Select multiple elements with Linq to XML使用 Linq to XML 选择多个元素
【发布时间】:2013-05-13 17:44:02
【问题描述】:

我有一个 C# 应用程序,需要从 Linq to XML 集合中提取多个元素。

我有以下 XML 文件的摘录

    <SNS>
    <uniqueSystem><system>49</system><label>Engines</label>
        <uniqueSubsystem><subsystem>30</subsystem><label>APU</label>
            <uniqueUnit><unit>00</unit><label>Starter</label>
    </uniqueUnit>
    </uniqueSubsystem>
    </uniqueSystem>
    <uniqueSystem><system>50</system><label>Hydraulics</label>
        <uniqueSubsystem><subsystem>30</subsystem><label>Reservoir</label>
            <uniqueUnit><unit>00</unit><label>Pump</label>
    </uniqueUnit>
    </uniqueSubsystem>
</uniqueSystem></SNS>

我需要从每个“uniqueSystem”元素中提取值。因此,在上面的示例中,在“SNS”元素下有 2 个“uniqueSystem”元素,每个元素中都有“uniqueSubsystem”元素和“uniqueUnit”元素,每个元素都带有“label”元素。我需要提取这些数据来构建 TreeView。

我的问题是使用 Linq 提取多个元素。我该怎么做?

我现在有

var item = from items in doc.Descendants("SNS").Descendants("uniqueSystem").Descendants("system")
                          orderby items.Value
                          select items.Descendants("uniqueSystem");

我认为这会给我一个“uniqueSystem”元素的集合,我现在需要从中提取多个元素的值。有人可以帮忙吗?

我的下一个 attmpt 如下,但这给了我一个空引用异常:

var item = from items in doc.Descendants("SNS").Descendants("uniqueSystem").Descendants("system")
                          orderby items.Value
                          select items.Descendants("uniqueSystem");

                foreach (var e in item)
                {
                    string sys = e.Descendants("system").FirstOrDefault().Value;
                    string sysLabel = e.Descendants("system").Descendants("label").FirstOrDefault().Value;

                    string subsys = e.Descendants("subsystem").FirstOrDefault().Value;
                    string subsysLabel = e.Descendants("subsystem").Descendants("label").FirstOrDefault().Value;

                    string unit = e.Descendants("unit").FirstOrDefault().Value;
                    string unitLabel = e.Descendants("unit").Descendants("label").FirstOrDefault().Value;

                    buildSystemNodes(sys, sysLabel);
                    //getSubSystems(myitem);
                }

【问题讨论】:

标签: c# xml linq-to-xml


【解决方案1】:

所以我在下面编写的代码将生成树视图。我正在使用的树视图类位于命名空间 System.Web.UI.WebControls 中。然而,函数是 O(n^3)。

    public void ProcessXml(string document)
    {
        var doc = XDocument.Parse(document, LoadOptions.None);
        var uniqueSystemList = doc.Element("SNS").Elements();

        var treeView = new TreeView();
        string value = string.Empty;
        string text = string.Empty;
        foreach (var uniqueSystem in uniqueSystemList)
        {
            value = uniqueSystem.Element("label").Value.ToString();
            text = uniqueSystem.Element("system").Value.ToString();
            var uniqueSystemNode = new TreeNode(text, value);
            var uniqueSubsystemList = uniqueSystem.Elements("uniqueSubsystem");
            foreach (var uniqueSubSystem in uniqueSubsystemList)
            {
                value = uniqueSubSystem.Element("label").Value.ToString();
                text = uniqueSubSystem.Element("subsystem").Value.ToString();
                var uniqueSubSystemNode = new TreeNode(text, value);
                var uniqueUnitList = uniqueSubSystem.Elements("uniqueUnit");
                foreach (var uniqueUnit in uniqueUnitList)
                {
                    value = uniqueUnit.Element("label").Value.ToString();
                    text = uniqueUnit.Element("unit").Value.ToString();
                    var uniqueUnitNode = new TreeNode(text, value);
                    uniqueSubSystemNode.ChildNodes.Add(uniqueUnitNode);
                }
                uniqueSystemNode.ChildNodes.Add(uniqueSubSystemNode);
            }
            treeView.Nodes.Add(uniqueSystemNode);
        }
    }

【讨论】:

  • 我很快就需要试试这个,但它看起来像我想要的,谢谢。
【解决方案2】:

检查这种代码是否能满足您的要求

        var doc = XDocument.Load(@"..\XMLFile1.xml");

        var res = doc.XPathSelectElements("/SNS/uniqueSystem");

        foreach (var item in res)
        {

            var us = new UniqueSystem
            {
                System = int.Parse(item.Element("system").Value),
                Label = item.Element("label").Value
            };

            if (item.Element("uniqueSubsystem") != null)
            {
                 // process the logic here
            }
        }

您可以将如下所示的模型绑定到

class UniqueSystem
{
    public int System { get; set; }
    public string Label { get; set; }
    public List<uniqueSubsystem> SubSystems { get; set; }
}

class uniqueSubsystem
{
    public int subsystem { get; set; }
    public string Label { get; set; }
    public List<uniqueUnit> Units { get; set; }
}

class uniqueUnit
{
    public int unit { get; set; }
    public string label { get; set; }
}

【讨论】:

    【解决方案3】:

    通过以下代码可以得到uniqueSubsystem

        XmlNodeList nodes = xml.SelectNodes("SNS/uniqueSystem/uniqueSubsystem");
        foreach (XmlNode i in nodes)
        {
            Response.Write(i.InnerXml);
        }
    

    如果你想要节点:

            XmlNodeList labels1 = xml.SelectNodes("SNS/uniqueSystem/uniqueSubsystem/label");
            XmlNodeList labels2 = xml.SelectNodes("SNS/uniqueSystem/uniqueSubsystem/uniqueUnit/label");
            Response.Write("SNS/uniqueSystem/uniqueSubsystem/label<br />");
            foreach (XmlNode i in labels1)
            {
                Response.Write(i.InnerText+"<br />");
            }
            Response.Write("<br />SNS/uniqueSystem/uniqueSubsystem/uniqueUnit/label<br />");
            foreach (XmlNode i in labels2)
            {
                Response.Write(i.InnerText+"<br />");
            }
    

    如果这对你有帮助,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多