Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.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
解析XML文档并保存到arraylist或alternative_Xml_Vb.net - Fatal编程技术网

解析XML文档并保存到arraylist或alternative

解析XML文档并保存到arraylist或alternative,xml,vb.net,Xml,Vb.net,我很抱歉发布这篇文章,因为这可能是一个愚蠢而简单的过程,但在尝试了一些方法之后,我仍然无法找到让这篇文章起作用的最佳方法 我已经创建了一个带有硬编码设置的程序,但我想让它稍后将XML文件和其中的数据解析为设置,以便其他用户可以在不必更新整个程序的情况下更新该程序(目前只有我自己可以这样做,而且一个用户友好的XML文件将非常有用) 到目前为止,我正在另一个项目中测试XML读取和处理,以便在将任何代码导入主程序之前了解它,但我查看了XMLReader和System.XML.XmlDocument,不

我很抱歉发布这篇文章,因为这可能是一个愚蠢而简单的过程,但在尝试了一些方法之后,我仍然无法找到让这篇文章起作用的最佳方法

我已经创建了一个带有硬编码设置的程序,但我想让它稍后将XML文件和其中的数据解析为设置,以便其他用户可以在不必更新整个程序的情况下更新该程序(目前只有我自己可以这样做,而且一个用户友好的XML文件将非常有用)

到目前为止,我正在另一个项目中测试XML读取和处理,以便在将任何代码导入主程序之前了解它,但我查看了XMLReader和System.XML.XmlDocument,不知道哪一个对我要实现的目标最有效

我使用的XML是:

<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"/>