vbscript选择子节点

时间:2012-12-19 14:41:31

标签: xml loops vbscript

我有以下XML,gXML从一个页面传递到另一个发送电子邮件的页面。

<root>
   <Lease>
       <row hello="none@nowhere.com">
       <row hello="none@nowhere.com">
       <row hello="none@nowhere.com">
       <row hello="none@nowhere.com">
   </Lease>
</root>

我希望能够向每一行发送电子邮件,我希望它像这样:

 
for (each row){
    blah blah blah (send email function)
}

如何选择XML中的行。

2 个答案:

答案 0 :(得分:2)

如果您使用的是VBScript,我假设您可以访问System.Xml。

在这个页面上看看: http://msdn.microsoft.com/en-us/library/system.xml.xmlnode.childnodes.aspx

在Google上挖掘一下,特别是看看使用System.Xml.XPath。那里有很多例子。

这是我在用于测试的控制台应用程序中编写的测试方法。它是用C#编写的,但这个想法应该有所帮助:

    private static void ExtractUserNodeFromUsersXml()
    {
        XmlDocument xmlDoc = new XmlDocument();

        string xml = @"<data xmlns=''><users><user id='33' culture='en-gb' />
<user id='38 culture='en-gb' />
<user id='285'culture='en-gb' /></users></data>";



        xmlDoc.LoadXml(xml);

        string userid = "38";

        XPathNavigator nav = xmlDoc.CreateNavigator();

        XPathNodeIterator userNodes = nav.Select("data/users/user[@id='" + userGuid + "']");

        while (userNodes.MoveNext())
        {
            if (userNodes.Current is IHasXmlNode)
            {
                XmlNode node = ((IHasXmlNode)userNodes.Current).GetNode();

                if (node != null)
                {
                    string culture = node.Attributes.GetNamedItem("culture").Value;

                    Console.WriteLine(node.OuterXml);
                    Console.WriteLine("Culture is " + culture);
                }
            }
        }

        Console.WriteLine();
        Console.WriteLine("******");
        Console.WriteLine();

        Console.WriteLine(xmlDoc.OuterXml);
    }

对于你需要的东西可能有点过分,但是如果你在线看并使用这个代码来玩,那么它会有所帮助。实际上,我现在就为你的XML改变这种方法。

使用您的XML更改XPathNavigator。

XPathNodeIterator emailNodes = nav.Select("root/Lease/row");

确保您的XML有效并记住'xpath'区分大小写。

答案 1 :(得分:2)

VBScript版本(最适合Docs使用):

  ' Assuming you have a string in gXML, I fake it here, please
  ' note the closing of the row nodes!
  Dim gXML : gXML = Join(Array( _
       "<root>" _
     , " <Lease>" _
     , "  <row hello=""none@nowhere.com""/>" _
     , "  <row hello=""none@nowhere.com""/>" _
     , "  <row hello=""none@nowhere.com""/>" _
     , "  <row hello=""none@nowhere.com""/>" _
     , " </Lease>" _
     , "</root>" _
  ), "")
  Dim oXML : Set oXML = CreateObject("Msxml2.DOMDocument")
  oXML.loadXml gXML
  If 0 = oXML.ParseError Then
     Dim ndlRow : Set ndlRow = oXML.selectNodes("/root/Lease/row")
     If 0 < ndlRow.length Then
        Dim nRow
        For nRow = 0 To (ndlRow.length - 1)
            WScript.Echo nRow, "send mail to", ndlRow(nRow).getAttribute("hello")
        Next
     Else
        WScript.Echo "no rows found"
     End If
  Else
     WScript.Echo oXML.parseError.reason
  End If

输出:

0 send mail to none@nowhere.com
1 send mail to none@nowhere.com
2 send mail to none@nowhere.com
3 send mail to none@nowhere.com

而不是计数循环

For nRow = 0 To (ndlRow.length - 1)
    WScript.Echo nRow, "send mail to", ndlRow(nRow).getAttribute("hello")
Next

你可以使用For Each Loop:

Dim ndRow
For Each ndRow In ndlRow
    WScript.Echo "send mail to", ndRow.getAttribute("hello")
Next