Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net XML获取一组节点属性并按节点分组?_Xml_Vb.net - Fatal编程技术网

VB.net XML获取一组节点属性并按节点分组?

VB.net XML获取一组节点属性并按节点分组?,xml,vb.net,Xml,Vb.net,我的XML文件如下所示 <?xml version="1.0" encoding="utf-8" ?> <root> <mob name="mob1" lvl="5" hp="30" mp="25"/> <mob name="mob2" lvl="6" hp="50" mp="55"/> <mob name="mob3" lvl="9" hp="80" mp="85"/> <mob name="mob4" lvl=

我的XML文件如下所示

<?xml version="1.0" encoding="utf-8" ?>
<root>
  <mob name="mob1" lvl="5" hp="30" mp="25"/>
  <mob name="mob2" lvl="6" hp="50" mp="55"/>
  <mob name="mob3" lvl="9" hp="80" mp="85"/>
  <mob name="mob4" lvl="11" hp="130" mp="125"/>
</root>
    <?xml version="1.0" encoding="utf-8" ?>
<root>
  <moblist list="mob1,mob2,mob3,mob4"/>
  <mob0 lvl="5" hp="30" mp="25"/>
  <mob1 lvl="6" hp="50" mp="55"/>
  <mob2 lvl="9" hp="80" mp="85"/>
  <mob3 lvl="11" hp="130" mp="125"/>
</root>
每次组合框的选定索引发生更改时,我都会让它关闭


问题1:是否有更好的方法实现这些结果?如果可以做得更好,我愿意更改xml结构。

您可以将xml缓存在内存中,如下所示:

Dim xml=
作为新列表的Dim Mob(Mob)
对于xml.Root.Elements中的每个e作为XElement
我是新的暴徒
m、 名称=e.属性(“名称”).值
m、 lvl=e.属性(“lvl”).值
m、 hp=e.属性(“hp”).值
m、 mp=e.属性(“mp”).值
暴徒。添加(m)
下一个
假设有以下类别的暴徒:

Class-Mob
作为字符串的公共属性名称
公共属性lvl作为字符串
公共属性作为字符串
公共属性mp作为字符串
Public将函数ToString()重写为字符串
返回我的名字
端函数
末级
然后使用数据绑定填充组合框:

comboBox1.DataSource = mobs
然后在SelectedIndexChanged事件中,从选定的Mob中提取并显示所需的数据:

Dim m As Mob=DirectCast(comboBox1.SelectedItem,Mob)
尺寸shw_lvl作为字符串=m.lvl
Dim shw_hp作为字符串=m.hp
尺寸shw\U mp为字符串=m.mp

您可以使用xml序列化

使用此xml文件


在VB中这样定义xml模型

Imports System.Xml.Serialization
导入System.IO

公共类XML模型
公共财产移动列表(XmlMob)
末级
公共类XmlMob
作为字符串的公共属性名称
公共属性级别为整数
作为整数的公共属性生命值
公共属性MagicPoints为整数
末级
然后将xml文件反序列化为
XmlModel
类的实例

私有xmlMobs作为XmlModel
私有子加载XmlFile()
Dim s作为新的XmlSerializer(GetType(XmlModel))
使用sr作为新的StreamReader(“c:/test.xml”)
xmlMobs=s.反序列化(sr)
终端使用
端接头
现在有了一个变量,
xmlMobs
,它保存了所有的mobs信息。然后可以修改该变量(更改名称、统计信息等),并将其序列化回文件中

Private子SaveXmlFile()
Dim s作为新的XmlSerializer(GetType(XmlModel))
将sw用作新的StreamWriter(“c:/test.xml”)
s、 序列化(sw、xmlMobs)
终端使用
端接头

总的来说:您真的不应该有“编号”的XML元素。如果存在多个mob实例,那么它们都应该是
,而不是
。改为使用
id
属性。(我也不确定
的目的是什么。它是在XML的结构中,没有必要保留一个明确的列表,或者是否存在?)此外,在没有看到其余代码的情况下,回答问题2并不容易。一种方法是在应用程序启动时加载一次XML文件,并在每次需要时使用内存中的实例。这是我唯一能找到的让它实现我想要的功能的方法,如何使用“id”属性填充组合框,然后在组合框中选择一个项目时,让它从与所选id相同的节点抓取所有其他属性并将它们放入变量中?组合框可以包含任意对象的列表,它们不必是字符串。例如,您可以在XmlNode对象上有一个组合框。比较上的MSDN文章。你也可以使用自定义的Mob对象,就像Neolik的答案所建议的那样。或者您可以直接从XML构建自定义对象。我认为您必须包含一个使用这种方法的XML示例。(还有一种方法,可以在你使用组合框时将其绑定到组合框。)@Tomalak我在OP的问题中使用了这个例子。为了清楚起见,我将在这里添加它。
comboBox1.DataSource = mobs