繁体   English   中英

名称不能以“1”字符开头,十六进制值0x31。 从xml文件中读取时

[英]Name cannot begin with the '1' character, hexadecimal value 0x31. while reading from an xml file

我正在使用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.

xmlfile内容是:

<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的条目,如果发现任何匹配,则“服务器名称”节点和“服务”名称“对应于两个的节点,必须显示在树视图列表中。

希望这有道理..

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. 我的组合框的值为一,二。
  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
       }
   }
}

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

你正在使用那个cmbbox_val作为Value.Equals和节点选择器:我敢打赌它包含string "1143"

问题是您将integer作为XElement name传递。 名称不应以数字开头。 可能的错误是你的代码中你通过了组合框。 SelectedIndex 如果你已经正确配置组合框(即1,“一个” 2“,二)你应该通过下拉框。 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());
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM