VB.net XML获取一组节点属性并按节点分组?
我的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 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