2013-12-13 5 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 отображает все атрибуты, независимо от того, что я проверил.

Например: если у меня есть «Redirect Site», я хочу, чтобы атрибут «\ 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

Вы перемещаетесь по каталогу, чтобы вы всегда получали все пути к сайту.

Вам нужно будет добавить проверку внутри сайтаLISTbox.CheckedItems для цикла, чтобы проверить и вернуть путь сайта для значения 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 =, которая выполняет большую часть работы. Во-первых, вы захватываете всех потомков root с именем «sitesEQ», затем вы выполняете поиск тех, у кого есть «nameEQ» «сайта перенаправления». Очевидно, вы хотели бы ввести имена переменных вместо строк. Затем он просто захватывает первый атрибут и снимает его значение.

Смежные вопросы