[英]Select multiple elements with Linq to XML
我有一個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”元素的集合,現在我需要從中提取其中多個元素的值。 有人可以幫忙嗎?
我的下一個提示如下,但這給了我一個空引用異常:
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);
}
通過以下代碼,您可以獲得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 />");
}
讓我知道這是否對您有幫助。
檢查這種代碼是否可以滿足您的要求
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; }
}
因此,我在下面編寫的代碼將生成樹視圖。 我正在使用的treeview類位於名稱空間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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.