【问题标题】:C# Storing Value of XML attribute from ListboxC# 从列表框中存储 XML 属性的值
【发布时间】:2014-01-01 09:49:36
【问题描述】:

当我只想要一个特定的属性值时,我的程序当前正在获取所有属性值,具体取决于选中的列表框项。任何帮助将不胜感激,在此先感谢!

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”而不是全部。

【问题讨论】:

  • 我发现 RePierre 的解决方案最有帮助。谢谢
  • 不错的选择。 :) 和一个很好的问题

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


【解决方案1】:

使用 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”的任何后代。显然,您希望输入变量名来代替字符串。然后它简单地抓取第一个属性并提取它的值。

【讨论】:

    【解决方案2】:

    对于这样一个简单的问题,您的代码相当复杂,所以让我们将其分解。

    首先,您需要一个方法,该方法将返回作为参数传递的元素的属性值

    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
    【解决方案3】:

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

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

    希望这会有所帮助...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      • 1970-01-01
      • 2017-12-05
      • 2020-06-16
      • 2020-05-20
      相关资源
      最近更新 更多