名称不能以“1”字符开头,十六进制值0x31.从 XML 文件读取时
本文关键字:0x31 十六进制 XML 读取 文件 开头 不能 字符 | 更新日期: 2023-09-27 18:34:56
我正在使用一个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 文件。
对此有什么想法吗?
任何想法将不胜感激。
编辑:
我的组合框具有类似 1,2 的值。
我正在尝试的是,如果用户在组合框中选择值 2,那么我的应用程序需要在 xml 文件中检查名称为 two 的条目,如果找到任何匹配项,则"服务器名称"节点和"服务名称"对应于两个的节点,必须显示在树视图列表中。
希望这是有道理的..
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 的条目
- 然后"服务器名称"节点和"服务名称"节点必须显示在树视图列表中。
步骤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
开头,并且您会收到该错误,因为您传递cmbbox_val
以获取Elements()
。
您正在将该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());
}