1

我正在使用 xml 文件来读取内容并将其显示在带有复选框的树视图列表中。这样做的条件是内容应该根据用户在组合框中选择的内容来显示。假设用户在组合框中选择了 2,那么树视图列表应该显示 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 文件。

对此有什么想法吗?

任何想法将不胜感激..

编辑:

我的组合框具有像一、二这样的值。

我正在尝试的是,如果用户在组合框中选择值 2,那么我的应用程序需要检查 xml 文件中名称为 2 的条目,如果找到任何匹配项,则“服务器名称”节点和“服务name"节点对应两个,必须显示在treeview列表中。

希望这是有道理的..

4

3 回答 3

3
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_val2 次,这Element("general")已经是您的 XML 的根。所以这是行不通的,但我们没有修复它的信息。


编辑后:

  1. 我的组合框具有像一、二这样的值。
  2. 需要检查 xml 文件中名称为 2 的条目
  3. 那么“服务器名称”节点和“服务名称”节点必须显示在树视图列表中。

步骤 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
       }
   }
}
于 2013-10-11T07:05:27.477 回答
1

根据 MSDN XElement.Elements()将一个字符串作为参数,该字符串表示要选择的元素的名称。名称不能以开头,1并且您会收到该错误,因为您传递cmbbox_val的是Elements().

您将其cmbbox_val用于Value.Equals和 作为节点选择器:我敢打赌它包含string "1143"

于 2013-10-11T07:10:43.147 回答
0

问题是您传递的是integeras XElement name。名称不应以数字开头。可能的错误是在您的代码中传递了组合框。SelectedIndex. 如果您已经正确配置了组合框(即 1,"one" 2,"two),您应该通过组合框SelectedValue。如果您没有填写组合框的值列表,您可以将代码更改为:

private void pjctsel_cmbbox_SelectedIndexChanged(object sender, EventArgs e)
    {            
        var xmldoc = File.ReadAllText(@"D:\\test.xml");
        var str = XElement.Parse(xmldoc);
        string cmbbox_val = pjctsel_cmbbox.SelectedIndex==0 ? "one" : "two";
        var res = str.Elements(cmbbox_val).Where(x => x.Element("general").Value.Equals(cmbbox_val)).ToList();
        MessageBox.Show(res.ToString());
    }
于 2013-10-11T07:12:55.737 回答