我正在使用 xml 文件读取内容并将其显示在带有复选框的 TreeView 列表中。这样做的条件是内容应该根据用户在组合框中选择的内容来显示。假设用户在组合框中选择了 2,那么 TreeView 列表应该显示 2 的内容(来自 xml 文件)。我试过这样的:
private void pjctsel_cmbbox_SelectedIndexChanged(object sender, EventArgs e)
{
var xmldoc = File.ReadAllText(@"D:\\test.xml");
var str = XElement.Parse(xmldoc);
cmbbox_val = pjctsel_cmbbox.SelectedIndex.ToString();
*** var res = str.Elements(cmbbox_val).Where(x => x.Element("general").Value.Equals(cmbbox_val)).ToList();
MessageBox.Show(res.ToString());
}
cmbbox_val = user selected value from combobox.
xml文件内容为:
<serv>
<general name="one">
<server name="oneone">
<service name="1143"/>
<service name="1142"/>
</server>
</general>
<general name="two">
<server name ="twoone">
<service name="2143"/>
<service name="2142"/>
</server>
</general>
</serv>
在我的 C# 代码中,我标记了 * 我收到以下异常“名称不能以 '1' 字符开头,十六进制值 0x31。”
用谷歌搜索,但我只能找到那些以标记字符串 1 开头的 xml 文件。
对此有什么想法吗?
任何想法将不胜感激..
编辑:
我的组合框有像一、二这样的值。
我正在尝试的是,如果用户在组合框中选择值二,那么我的应用程序需要检查 xml 文件中名称为二的条目,如果找到任何匹配项,则“服务器名称”节点和“服务名称”两个对应的节点,必须显示在 TreeView 列表中。
希望这是有道理的..
最佳答案
cmbbox_val = pjctsel_cmbbox.SelectedIndex.ToString(); // SelectedIndex is an integer
var res = str
.Elements(cmbbox_val) // so this will fail
.Where(x => x.Element("general")
.Value.Equals(cmbbox_val)).ToList();
这可能有效:
cmbbox_val = pjctsel_cmbbox.SelectedItem.ToString(); // or SelectedItem.SomeProperty
但我还注意到您正在寻找 cmbbox_val
2 次并且 Element("general")
已经是您的 XML 的根。所以这行不通,但我们没有修复它的信息。
修改后:
- My combo box has values like one,two.
- needs to check for an entry with the name two in the xml file
- then the "server name" node and "service name"nodes must be displayed in the treeview list.
步骤 1) 和 2)
var str = XElement.Parse(xmldoc);
IEnumerable<XElement> generals = str
.Elements("general")
.Where(g => g.Attribute("name") == cmbbox_val);
并且因为该结果是分层的,所以我将它与 foreach()
一起使用而不是 Linq,如下所示:
foreach(var general in generals) // probably only 1
{
foreach (var server in general.Elements("server"))
{
string serverName = server.Attribute("name").value;
foreach(var service in server.Elements("service"))
{
// etc
}
}
}
关于c# - 名称不能以 '1' 字符开头,十六进制值为 0x31。从 xml 文件读取时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19312039/