XML 파일을 쿼리하는 다음과 같은 방법이 있습니다. 내 시스템에 전달하는 'sys'변수와 일치하는 "System"요소가있는 모든 파일에 대한 정보를 반환해야합니다.C# Linq to XML 쿼리 만 1 결과를 반환합니다.
XML 파일에 일치하는 항목이 2 개 이상있는 경우 1 개의 결과 만 반환합니다.
마치 내 Linq 쿼리가 결과를 찾을 때까지 XML 파일을 trhough로 이동하는 것과 같습니다. 반면에 모든 일치 항목을 수집해야합니다.
<DMs>
<dataModule>
<DMC>DMC-AJ-A-29-13-54-00ZZZ-254Z-B_001-00.XML</DMC>
<techName>Pressure switch</techName>
<infoName>Clean mechanically</infoName>
<system>72</system>
<subsystem>13</subsystem>
<subsubsystem>60</subsubsystem>
<status>Checked Out</status>
<notes>-</notes>
<currentUser>JakeMemery</currentUser>
<validator>-</validator>
<dateMod>-</dateMod>
<size>-</size>
</dataModule>
<dataModule>
<DMC>DMC-AJ-A-30-15-62-00AAA-066A-D_001-00.XML</DMC>
<techName>Pressure switch</techName>
<infoName>Support equipment and tools data</infoName>
<system>29</system>
<subsystem>13</subsystem>
<subsubsystem>54</subsubsystem>
<status>Checked In</status>
<notes>-</notes>
<currentUser>-</currentUser>
<validator>-</validator>
<dateMod>-</dateMod>
<size>-</size>
</dataModule>
<dataModule>
<DMC>DMC-AJ-A-45-60-12-00AAA-420A-B_001-00.XML</DMC>
<techName>Pressure switch</techName>
<infoName>General fault isolation procedure</infoName>
<system>29</system>
<subsystem>20</subsystem>
<subsubsystem>10</subsubsystem>
<status>Checked In</status>
<notes>-</notes>
<currentUser>-</currentUser>
<validator>-</validator>
<dateMod>-</dateMod>
<size>-</size>
</dataModule>
</DMs>
그래서 예를 들어, 난 내 방법 (29)의 값에 전달할 수 있습니다
public ListViewItem getDMcollection(string sys)
{
XDocument doc = XDocument.Load(Form1.CSDBpath + Form1.projectName + "\\Data.xml");
var dms = from dm in doc.Descendants("dataModule")
where dm.Descendants("system").First().Value == sys
select dm;
foreach (var module in dms)
{
ListViewItem item = new ListViewItem(new string[]
{
module.Element("DMC").Value,
module.Element("techName").Value,
module.Element("infoName").Value,
module.Element("status").Value,
module.Element("currentUser").Value,
module.Element("validator").Value,
module.Element("notes").Value,
//dm.Element("size").Value + " kb",
//dm.Element("dateMod").Value
});
return item;
}
return null;
}
이
는 XML 파일의 샘플입니다. 위의 XML 파일에는 두 개의 'System'29 일치 항목이 있지만, 내 프로그램은 첫 번째 항목 만 재검색합니다.'SYS'변수에 위의를 호출하고 전달하는 방법은 이것이다 :
public ListViewItem splitSNS(string fullSNSpath)
{
string sns = new String(fullSNSpath.ToCharArray().Where(c => Char.IsDigit(c)).ToArray());
if (sns.Length.ToString() == "6")
{
string sys = sns.Substring(4, 2);
string subsys = sns.Substring(2, 2);
string unit = sns.Substring(0, 2);
ListViewItem dms = getDMcollection(sys, subsys, unit);
return dms;
}
else if (sns.Length.ToString() == "4")
{
string sys = sns.Substring(2, 2);
string subsys = sns.Substring(0, 2);
ListViewItem dms = getDMcollection(sys, subsys);
return dms;
}
else if (sns.Length.ToString() == "2")
{
string sys = sns.Substring(0, 2);
ListViewItem dms = getDMcollection(sys);
return dms;
}
return null;
}
및 위의 호출 방법의 추출물 당신은 system
을 원하는
ListViewItem dms = newFilter.splitSNS(fullSNSpath);
if (dms != null)
{
// showfilteredList(dms);
listView1.Items.Add(dms);
showStatus(dms);
}
else
{
MessageBox.Show("There are no DMs to be displayed");
}
이 줄은 아마도 여기에 있습니다 : dm.Descendants ("system"). First() .Value == sys (First() 항목 만 요구할 때). – Ric