2013-12-13 15 views
1

當我只想要一個特定的屬性值時,我的程序正在抓取所有屬性值,具體取決於檢查哪個列表框項目。任何幫助將不勝感激,提前致謝!C#從列表框中存儲XML屬性的值

XML:

<Products> 
<Equity> 
<servers> 
    <serverEQ>server1</serverEQ> 
    <serverEQ>server2</serverEQ> 
    <serverEQ>server3</serverEQ> 
</servers> 
<sitesE> 
    <sitesEQ sitePathEQ="\Logs\W3SVC1"><nameEQ>SystemAdmin Site</nameEQ></sitesEQ> 
    <sitesEQ sitePathEQ="\Logs\W3SVC3"><nameEQ>Direct Access Site</nameEQ></sitesEQ> 
    <sitesEQ sitePathEQ="\Logs\W3SVC4"><nameEQ>Redirect Site</nameEQ></sitesEQ> 
    <sitesEQ sitePathEQ="\Logs\W3SVC5"><nameEQ>Download Site</nameEQ></sitesEQ> 
</sitesE> 
</Equity> 
. 
. 
. 
</Products> 

C#:

myXML.siteName = "sitesEQ"; 
myXML.sitePath = "sitePathEQ"; 
. 
. 
. 
private void Submit_btn_Click(object sender, EventArgs e) 
    { 
     XmlElement root = MYproducts.DocumentElement; 
     XmlNodeList sitelist = root.GetElementsByTagName(myXML.siteName); 

    foreach (object ServerChecked in serverLISTbox.CheckedItems) 
     { 
      string MyServerChecked = ServerChecked.ToString(); 

      MessageBox.Show(MyServerChecked); 
      foreach (object SiteChecked in siteLISTbox.CheckedItems) 
      { 

       foreach (XmlNode s in sitelist) 
       { 

        myXML.xmlAttributes = s.Attributes[myXML.sitePath].Value; 
        MessageBox.Show(myXML.xmlAttributes); 
       } 
    } 

myXML.xmlAttributes顯示的是不管是什麼我都檢查過了屬性。

例如:如果我選中「重定向網站」,我只希望屬性「\ Logs \ W3SVC4」不是全部。

+0

我發現RePierre的解決方案最有幫助。謝謝 – SlopTonio

+0

不錯的選擇。 :)和一個很好的問題 – paqogomez

回答

1

您的代碼是這樣一個簡單的問題相當複雜的話,讓我們打破它切成小塊。

首先,你需要將返回屬性值的元素的方法,你傳遞的參數

private IEnumerable<string> GetAttributeValuesForElements(IEnumerable<string> elementNames) 
{ 
    var document = XDocument.Load("path-to-your-xml"); 
    var results = document.Descendants(myXml.siteName) 
     .Join(elementNames, 
      element => element.Elements().First().Value, 
      name => name, 
      (element, name) => element.Attribute(myXml.sitePath).Value); 
    return results; 
} 

所有第二,你需要一個方法,將從列表框返回選定名稱:

private IEnumerable<string> GetSelectedNames(Listbox listbox) 
{ 
    foreach(var item in listbox.CheckedItems) 
     yield return item.ToString(); 
} 

現在,把那兩個一起在事件處理:

private void Submit_btn_Click(object sender, EventArgs e) 
{ 
    var selected = GetSelectedNames(serverLISTbox); 
    var attributes = GetAttributeValuesForElements(selected); 
    // do stuff with the attributes. 
} 

希望這有助於...

+0

非常感謝你!!!!! – SlopTonio

+0

非常好的答案。我喜歡你如何產生檢查項目。 +1 – paqogomez

0

您正在循環播放列表,因此您將始終獲取所有網站路徑。

您需要在siteLISTbox.CheckedItems for循環中添加一個檢查,以檢查並返回SiteChecked值的站點路徑。

希望這有助於...

0

使用LINQ到XML

var xmlstring = @"<Products> 
       <Equity> 
       <servers> 
        <serverEQ>server1</serverEQ> 
        <serverEQ>server2</serverEQ> 
        <serverEQ>server3</serverEQ> 
       </servers> 
       <sitesE> 
        <sitesEQ sitePathEQ=""\Logs\W3SVC1""><nameEQ>SystemAdmin Site</nameEQ></sitesEQ> 
        <sitesEQ sitePathEQ=""\Logs\W3SVC3""><nameEQ>Direct Access Site</nameEQ></sitesEQ> 
        <sitesEQ sitePathEQ=""\Logs\W3SVC4""><nameEQ>Redirect Site</nameEQ></sitesEQ> 
        <sitesEQ sitePathEQ=""\Logs\W3SVC5""><nameEQ>Download Site</nameEQ></sitesEQ> 
       </sitesE> 
       </Equity> 
       </Products>"; 

var xml = XDocument.Parse(xmlstring); 
var node = xml.Descendants("sitesEQ").Where(d => d.Descendants("nameEQ") 
            .Any(n => n.Value == "Redirect Site")); 
var attribute = node.Attributes().FirstOrDefault(); 
var logValue = attribute.Value; 

,如果你需要加載一個文件,可以使用XDocument.Load("path to xml file")。我只是將它作爲分析字符串來創建一個工作示例。

它的var node =線,大部分的工作。首先,您抓取所有名爲「sitesEQ」的根的後代,然後搜索那些具有「重定向網站」的「nameEQ」的任何後裔。顯然,你想要輸入你的變量名來代替字符串。然後,它簡單地抓住第一個屬性並取消其價值。