当我只想要一个特定的属性值时,我的程序正在抓取所有属性值,具体取决于选中的列表框项。非常感谢任何帮助,提前谢谢!
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 :(得分: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”的任何后代。显然,您需要输入变量名来代替字符串。然后它只是抓取第一个属性并拉出它的值。