C#存储Listbox中XML属性的值

时间:2013-12-13 15:09:32

标签: c# xml xml-parsing linq-to-xml xml-attribute

当我只想要一个特定的属性值时,我的程序正在抓取所有属性值,具体取决于选中的列表框项。非常感谢任何帮助,提前谢谢!

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”而不是所有属性。

3 个答案:

答案 0 :(得分: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.
}

希望这会有所帮助......

答案 1 :(得分:0)

您正在通过站点列表循环,因此您将始终获得所有站点路径。

您需要在siteLISTbox.CheckedItems for循环内添加一个检查,以检查并返回SiteChecked值的站点路径。

希望这会有所帮助......

答案 2 :(得分:0)

使用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”的root的所有后代,然后搜索那些具有“nameEQ”“Redirect Site”的任何后代。显然,您需要输入变量名来代替字符串。然后它只是抓取第一个属性并拉出它的值。

相关问题