0

C# アプリケーションがあり、Linq から 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」要素のコレクションが得られると思います。そこから、複数の要素の値を抽出する必要があります。誰でも助けてもらえますか?

次の試行は次のとおりですが、これにより null 参照例外が発生します。

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);
                }
4

3 に答える 3

0

この種のコードが要件を満たすかどうかを確認してください

        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; }
}
于 2013-05-13T09:23:40.540 に答える
0

したがって、以下に記述したコードはツリー ビューを生成します。私が使用しているツリービュー クラスは、名前空間 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);
        }
    }
于 2013-05-13T09:36:11.830 に答える