c# - 名称不能以 '1' 字符开头,十六进制值为 0x31。从 xml 文件读取时

标签 c# xml winforms linq

我正在使用 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 的根。所以这行不通,但我们没有修复它的信息。


修改后:

  1. My combo box has values like one,two.
  2. needs to check for an entry with the name two in the xml file
  3. 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/

相关文章:

c# - grid view的row命令中如何找到控件呢?

android - 如何将 utf-16 字符放入 Android 字符串资源中?

winforms - DevExpress 中的 BarButtonItem 和 RibbonBarManager 点击事件

c# - Winforms 将 ComboBox SelectedItem 绑定(bind)到对象属性

c# - xml文件拆分算法

.net - DataGridView:如何让回车键添加新行而不是更改当前单元格?

c# - 映射多对多关系与/外键引用

javascript - 在javascript中声明可观察到的动态 knockout

c# - 如何在长逻辑流中保持数据库并发

xml - 有什么方法可以更改 xsd :element? 的默认类型