我正在寻找一种方法来遍历我的 XML 文档的所有节点。
XML 文件示例
<root>
<llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
<llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
<llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
</llnode>
<llnode created="2005-05-24T15:26:24" createdby="42912153" createdbyname="" description="" id="107810306" modified="2008-06-05T16:07:44" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810295" size="4">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
<llnode created="2005-05-06T12:54:03" createdby="42912153" createdbyname="" description="" id="107815681" modified="2006-12-04T14:39:51" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
<llnode created="2005-05-06T12:54:31" createdby="42912153" createdbyname="" description="" id="107815683" modified="2006-12-04T14:39:53" name="" objname="" objtype="0" ownedby="42912153" ownedbyname="" parentid="107810306" size="0">
<Nickname domain=""/>
<MajorMinorContainer>false</MajorMinorContainer>
</llnode>
</llnode>
</root>
文档始终具有相同的结构。每个 llnode 代表一个文件夹。这可能会很深(对于上面的例子,范围只有 2,但它可以达到 10)。
如何遍历所有记录?我不想将一个循环放入一个循环,然后再放入另一个循环,然后重复 20 次以确保处理好每个节点。有没有办法只做一个循环的循环?
以下是我目前得到的,仅适用于实际的 XML 文档 (scope=2),随着范围的增加需要添加尽可能多的循环(它不应该超过 scope=10)
原始 VBA(来自原始问题)
xmlExportDoc = "myXmlDoc.xml"
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.Load (xmlExportDoc)
Set xmlNodeList = xmlDoc.SelectNodes("//llnode")
For Each Node In xmlNodeList
MsgBox "Listing the EXISTING nodes"
MsgBox Node.nodeName & " " & Node.NodeValue & " " & Node.NodeType
If Node.HasChildNodes() Then
MsgBox Node.nodeName & "has child nodes"
Set xmlNodeList2 = Node.ChildNodes
For Each Node2 In oNodeList2
MsgBox Node2.nodeName & " " & Node2.NodeValue & " " & Node2.NodeType
If Node2.HasChildNodes() Then
MsgBox Node2.nodeName & "has child nodes"
End If
Next
End If
Next
更新的 VBA
Private Function xmlParse(n As MSXML2.IXMLDOMNode)
Dim n2 As MSXML2.IXMLDOMNode
MsgBox n.nodeName & " " & n.NodeValue & " " & n.NodeType
If n.HasChildNodes() Then
MsgBox n.nodeName & " has child nodes"
For Each n2 In n.ChildNodes
xmlParse (n2)
Next
MsgBox "Done listing child nodes for " & n.nodeName
End If
End Function
以及事件的代码:
Dim xmlExportDoc As String
Dim xmlDoc As MSXML2.DOMDocument
Dim xmlNodeList As MSXML2.IXMLDOMNodeList, xmlNodeList2
Dim Node As MSXML2.IXMLDOMNode
xmlExportDoc = "http://myserver.com/myDoc.xml"
Set xmlDoc = New MSXML2.DOMDocument
xmlDoc.async = False
xmlDoc.Load (xmlExportDoc)
Set xmlNodeList = xmlDoc.SelectNodes("//llnode")
For Each Node In xmlNodeList
Call xmlParse(Node)
Next
这仍然不起作用,在执行递归 xmlParse() 调用时出错,因为 MSXML2.IXMLDOMNode.ChildNodes 似乎不是 MSXML2.IXMLDOMNode 类型。
最佳答案
我想你在这里需要的是一个递归函数。我真的不知道 VBA 语法,所以请原谅伪代码,但你应该能够做这样的事情:
Set xmlNodeList = xmlDoc.SelectNodes("/*/llnode")
For Each node in xmlNodeList
ListNodes(node)
Next
Function ListNodes(n As Node)
MsgBox n.nodeName & " " & n.NodeValue & " " & n.NodeType
If n.HasChildNodes() Then
MsgBox n.nodeName & "has child nodes"
For Each n2 in n.ChildNodes
ListNodes(n2)
Next
MsgBox "Done listing child nodes for " & n.nodeName
End If
End Function
关于xml - 遍历完整的 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14401193/
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg
所以这可能有点令人困惑,但请耐心等待。简而言之,我想遍历具有特定键值的所有属性,然后如果值不为空,则将它们插入到模板中。这是我的代码:属性:#===DefaultfileConfigurations#default['elasticsearch']['default']['ES_USER']=''default['elasticsearch']['default']['ES_GROUP']=''default['elasticsearch']['default']['ES_HEAP_SIZE']=''default['elasticsearch']['default']['MAX_OP
我们有一个字符串:“”这个正则表达式://i如何从当前字符串中获取所有匹配项? 最佳答案 "".scan(//)参见scan在ruby-docs上 关于ruby-如何遍历Ruby中所有正则表达式匹配的字符串?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6857852/
Ruby有一些不错的文档生成器,例如Yard、rDoc,甚至Glyph。问题是Sphinx可以做网站、PDF、epub、LaTex等。它在重组文本中完成所有这些事情。在Ruby世界中有替代方案吗?也许是程序的组合?如果我也能使用Markdown就更好了。 最佳答案 自1.0版以来,Sphinx有了“域”的概念,它是从Python和/或C以外的语言标记代码实体(如方法调用、对象、函数等)的方法。有一个rubydomain,所以你可以只使用Sphinx本身。您唯一会缺少的(我认为)是Sphinx使用autodoc从源代码自动创建文档
我怀念ipython的一件事是它有一个?为特定功能挖掘文档的运算符。我知道ruby有一个类似的命令行工具,但是我在irb中调用它非常不方便。ruby/irb有类似的东西吗? 最佳答案 Pry是IPython的Ruby版本,它支持?命令来查找有关方法的文档,但语法略有不同:pry(main)>?File.dirnameFrom:file.cinRubyCore(CMethod):Numberoflines:6visibility:publicsignature:dirname()Returnsallcomponentsofthef
我想禁用HTTP参数的自动XML解析。但我发现命令仅适用于Rails2.x,它们都不适用于3.0:config.action_controller.param_parsers.deleteMime::XML(application.rb)ActionController::Base.param_parsers.deleteMime::XMLRails3.0中的等价物是什么? 最佳答案 根据CVE-2013-0156的最新安全公告你可以将它用于Rails3.0。3.1和3.2ActionDispatch::ParamsParser::
我正在尝试使用nokogirigem提取页面上的所有url及其链接文本,并将链接文本和url存储在散列中。FooBar我想回去{"Foo"=>"#foo","Bar"=>"#bar"} 最佳答案 这是一个单行:Hash[doc.xpath('//a[@href]').map{|link|[link.text.strip,link["href"]]}]#=>{"Foo"=>"#foo","Bar"=>"#bar"}拆分一点可以说更具可读性:h={}doc.xpath('//a[@href]').eachdo|link|h[link.t