С# Хранение значения атрибута 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», а не все из них.


person SlopTonio    schedule 13.12.2013    source источник
comment
Я нашел решение RePierre наиболее полезным. Благодарю вас   -  person SlopTonio    schedule 13.12.2013
comment
Хороший выбор. :) и отличный вопрос   -  person crthompson    schedule 13.12.2013


Ответы (3)


Ваш код довольно сложен для такой простой задачи, так что давайте разобьем его на части.

Прежде всего, вам нужен метод, который будет возвращать значения атрибутов для элементов, которые вы передаете в качестве аргумента.

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.
}

Надеюсь это поможет...

person RePierre    schedule 13.12.2013
comment
очень хороший ответ. Мне нравится, как вы возвращаете проверенные предметы. +1 - person crthompson; 13.12.2013

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

Вам нужно будет добавить проверку внутри цикла siteLISTbox.CheckedItems for, чтобы проверить и вернуть путь к сайту для значения SiteChecked.

Надеюсь это поможет...

person Jasmin    schedule 13.12.2013

использовать Linq to 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» «Redirect Site». Очевидно, вы захотите ввести имена переменных вместо строк. Затем он просто берет первый атрибут и извлекает его значение.

person crthompson    schedule 13.12.2013