解析XML文档并保存到arraylist或alternative
我很抱歉发布这篇文章,因为这可能是一个愚蠢而简单的过程,但在尝试了一些方法之后,我仍然无法找到让这篇文章起作用的最佳方法 我已经创建了一个带有硬编码设置的程序,但我想让它稍后将XML文件和其中的数据解析为设置,以便其他用户可以在不必更新整个程序的情况下更新该程序(目前只有我自己可以这样做,而且一个用户友好的XML文件将非常有用) 到目前为止,我正在另一个项目中测试XML读取和处理,以便在将任何代码导入主程序之前了解它,但我查看了XMLReader和System.XML.XmlDocument,不知道哪一个对我要实现的目标最有效 我使用的XML是:解析XML文档并保存到arraylist或alternative,xml,vb.net,Xml,Vb.net,我很抱歉发布这篇文章,因为这可能是一个愚蠢而简单的过程,但在尝试了一些方法之后,我仍然无法找到让这篇文章起作用的最佳方法 我已经创建了一个带有硬编码设置的程序,但我想让它稍后将XML文件和其中的数据解析为设置,以便其他用户可以在不必更新整个程序的情况下更新该程序(目前只有我自己可以这样做,而且一个用户友好的XML文件将非常有用) 到目前为止,我正在另一个项目中测试XML读取和处理,以便在将任何代码导入主程序之前了解它,但我查看了XMLReader和System.XML.XmlDocument,不
<ProgramName
updated="11/12/13"
lastuser="james.xxxxxxx"
>
<school name="school name" id="1">
<netbios> NETBIOS </netbios>
<domainname> SCHOOLNAME.local </domainname>
<drives>
<!-- Generic variables -->
<variable name="server1"> \\server1\ </variable>
<variable name="server2"> \\server2\ </variable>
<!-- Work drives -->
<!-- Note, you can use $server1 or $server2 to use the above variables -->
<restriction usergroup="office users">
<drive name="Home Drive"> \\server1\officework$ </drive>
<drive name="Office Drive"> \\server1\Office Shared </drive>
</restriction>
<restriction usergroup="staff users">
<drive name="Home Drive"> \\server1\staffwork$ </drive>
</restriction>
<restriction usergroup="all users">
<drive name="Staff Shared"> \\server1\staff shared </drive>
<drive name="Pupil Shared"> \\server1\pupil shared </drive>
<drive name="Another drive"> \\server1\another drive </drive>
</restriction>
</drives>
</school>
</ProgramName>
然后我的想法是将它转换成可以直接引用的东西,我猜这将是一个新的对象(我仍然在思考什么时候是为某个东西创建新对象的最佳时机)
我想我会使用XPath找到合适的部分(例如,用户选择的学校),然后我需要考虑驱动器映射的最佳存储类型,以便我可以循环浏览它们
在硬编码版本中,我使用了一个集合,其中键是驱动器号,值是UNC路径,并在集合中循环映射它们。不太好,我知道
谢谢
编辑2
我刚刚发现,使用XPath看起来非常有前途
我会找到用户选择的学校,然后从这里我将创建一个包含所有相关元素(netbios、域名等)的对象,您是否建议对驱动器使用某种列表/阵列
如果对此感到乐观,我会让你知道的!
谢谢。关于您的一般问题: 根据数据的使用情况,我想我会创建一个或多个与数据对应的类。这类似于序列化/反序列化,但您可能必须对此类进行自定义实现 我不理解的是您对使用System.Xml.XmlDocument的“无终止元素检测”问题的评论。这意味着加载的Xml格式不正确,这使我认为您是通过字符串操作创建Xml的 您至少应该能够执行以下操作:
Dim doc as XmlDocument = new XmlDocument()
doc.LoadXml(fullFileNamePath)
如果不能,则需要在进一步操作之前使xml格式良好
性能差可能是由许多因素造成的。你的档案有多大?
复制:我想你需要解释一下(一个具体的小例子)。
通常,您可以执行以下操作:
doc.SelectNodes("/ProgramName/school/drives/restriction[@usergroup = 'office users']/drive"/>
这将选择名为“Home drive”和“Office drive”的两个驱动器元素。
这需要有关xpath的知识
另一种方法是使用XElement和LINQ,但我在这方面没有太多经验。我认为我的很多问题在于如何真正理解我希望(或应该)如何从XML传递信息。基本上,用户将选择他们的学校,然后程序将拨打VPN,然后运行驱动器地图列表。与其使用递归子例程不断扩展节点的子节点以查找元素,doc.SelectNodes是否会更有效(假设我知道路径)?这种迟钝是我自己的错误,我试图编写一些东西(将发布一个示例),重复也是一个类似的问题。我将重写并从这里开始尝试。谢谢你的帮助。我会一直使用内在的方法,除非它们被证明在某些方面是错误的。XPath,是的:-)我的doc.SelectNodes中有一个小错误,我现在已经更正了。
doc.SelectNodes("/ProgramName/school/drives/restriction[@usergroup = 'office users']/drive"/>